我迁移下面的SQL Server查询是否可以将SQL Server CTE查询转换为Postgres?
;WITH CTE AS
(
SELECT
ID, StartAptDate, EndAptDate,
RowNumber = ROW_NUMBER() OVER(ORDER BY StartAptDate ASC)
FROM
Appointments
WHERE
StylistId = 1
AND StartAptDate > CAST(CONVERT(CHAR(8), GetDate(), 112) AS DATETIME)
)
SELECT
FirstApptAvail = min(a.EndAptDate)
FROM
CTE a
INNER JOIN
CTE b ON a.RowNumber = b.RowNumber - 1
WHERE
datediff(minute, a.EndAptDate, b.StartAptDate) >= 15
AND (CAST(CONVERT(CHAR(8), a.StartAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:57:57' AND '1900-01-01 18:59:59'
AND CAST(CONVERT(CHAR(8), a.EndAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:57:57' AND '1900-01-01 18:59:59')
AND ((DATEPART(dw, a.StartAptDate) + @@DATEFIRST) % 7) NOT IN (0, 1)
我迁移的数据库,以Postgres的我修改上面简单的开始/结束列名后“开始”和“结束”。事实证明,postgres不喜欢“结束”名称,所以我一直试图逃避它,但因为我也使用DATE_PART函数,所以我需要尊重单引号。这是我到目前为止,但我希望有一些帮助完成最终转换(假设这可以移植到postgres)
WITH RECURSIVE CTE AS (SELECT id, start, "end", RowNumber =
ROW_NUMBER() OVER(order by start asc)
FROM api_appointment
WHERE employee_id = 1 AND start > now())
SELECT FirstApptAvail = min(a."end")
FROM CTE a
INNER JOIN CTE b ON a.RowNumber = b.RowNumber - 1
WHERE DATE_PART('minute', a.start - b.start) >= 0
AND a.start >= '1900-01-01 07:57:57'
AND a.start <= '1900-01-01 18:59:59'
AND a."end" >= '1900-01-01 07:57:57'
AND a."end" <= '1900-01-01 18:59:59');
@ErwinBrandstetter错过了别名,谢谢。 –
此外,这里的数据表达的范围类型相同。它们看起来不像我想象的那么有用,或者我不够聪明,无法解决如何使用它们。 http://sqlfiddle.com/#!15/712cb –
哇 - 完全被你的答案完全吹走了!感谢您花时间帮助!一个问题 - 使用“lead”的第二个片段 - 这是建议的解决方案(实质上是改进原始的)? –