我遷移下面的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」的第二個片段 - 這是建議的解決方案(實質上是改進原始的)? –