我需要創建一個可以重復使用的 CTE,它可以保存七個日期。那是今天和接下來的六天。
因此,今天(2022 年 4 月 22 日)的輸出應該是:
2022-04-22
2022-04-23
2022-04-24
2022-04-25
2022-04-26
2022-04-27
2022-04-28
到目前為止,我有這個:
WITH seq AS
(
SELECT 0 AS [idx]
UNION ALL
SELECT [idx] 1
FROM seq
WHERE [idx] < 6
)
SELECT DATEADD(dd, [idx], CONVERT(date, GETDATE()))
FROM seq;
問題是我的 SELECT 在 WITH 之外,所以我需要用另一個 WITH 將整個東西包裝起來以重新使用它,例如作為日期串列加入它,而我沒有運氣嵌套與作業。我還能怎么做到這一點?
需要明確的是:我不是要在一個特定的表中查找記錄,該表中的日期是從接下來的 7 天開始的。有很多簡單的解決方案。我需要今天和接下來六天的日期串列,我可以在其他查??詢中將其作為 CTE 重復使用。
uj5u.com熱心網友回復:
你很近。這是一個例子:
with cte as (
select
1 as n
,GETDATE() as dt
union all
select
n 1
,DATEADD(dd,n,GETDATE()) as dt
from cte
where n <= 6
)
select * from cte
在這里提琴
您可以為可重用性創建一個視圖并簡單地查詢該視圖,而不是一遍又一遍地使用相同的 CTE。
uj5u.com熱心網友回復:
您可以通過將日期的第二列添加到 CTE 來做到這一點:
WITH seq AS (
SELECT 0 AS [idx], cast(current_timestamp as date) as date
UNION ALL
SELECT [idx] 1, dateadd(dd, idx 1, cast(current_timestamp as date))
FROM seq
WHERE [idx] < 6
)
SELECT *
FROM seq;
在這里看到它:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=208ecd76be2071529078f38b1735b0cd
另一種選擇是您可以“堆疊”CTE,而不是嵌套,以避免第二列:
WITH seq0 AS (
SELECT 0 AS [idx]
UNION ALL
SELECT [idx] 1
FROM seq0
WHERE [idx] < 6
),
seq As (
SELECT dateadd(dd, idx, cast(current_timestamp as date)) as idx
FROM seq0
)
SELECT *
FROM seq;
請注意最終查詢如何只需要參考第二個 CTE。
在這里看到它:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=22315438e4710792f368009cc6ff6451
uj5u.com熱心網友回復:
如果您不需要遞回,請不要推薦使用它。它更復雜,更慢。我只是使用硬編碼的數字串列,如果您想在不同的存盤程序/函式中重用它,可以將它封裝在 TVF 中。如果您需要在多個地方的 1 個存盤程序中重用它,我只需將其放入臨時表中。
沒有遞回的 CTE 版本
WITH cte_7days AS (
SELECT theDate = CAST(DATEADD(dd,num,GETDATE()) AS DATE)
FROM (VALUES (0),(1),(2),(3),(4),(5),(6)) AS A(num)
)
SELECT *
FROM cte_7days
CROSS APPLY 版本消除對 CTE 的需求
可以使用這樣的東西作為您的基本查詢,然后根據您的查詢在表下方添加更多連接
SELECT theDate
FROM (VALUES (0),(1),(2),(3),(4),(5),(6)) AS A(num)
CROSS APPLY (SELECT theDate = CAST(DATEADD(DAY,num,GETDATE()) AS DATE)) AS B
TVF版
CREATE FUNCTION dbo.uf_7days()
RETURNS TABLE AS
RETURN
(
SELECT theDate
FROM (VALUES (0),(1),(2),(3),(4),(5),(6)) AS A(num)
CROSS APPLY (SELECT theDate = CAST(DATEADD(DAY,num,GETDATE()) AS DATE)) AS B
)
GO
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462426.html
上一篇:轉置多個相關列
