我們如何在此表中保留從今天開始的最后 n 個作業日的記錄:
Suppose n = 7
樣本資料:
表格1:
Date
----------
2021-11-29
2021-11-30
2021-12-01
2021-12-02
2021-12-03
2021-12-04
2021-12-05
2021-12-06
2021-12-07
2021-12-08
2021-12-09
2021-12-10
2021-12-11
2021-12-12
2021-12-13
基于此表資料,我們希望輸出如下所示。它應該洗掉 03-Dec 之前的所有行或過去 7 個作業日的資料。
Date
-------
2021-12-03
2021-12-06
2021-12-07
2021-12-08
2021-12-09
2021-12-10
2021-12-13
注意:如果我們在作業日之間保留周六、周日的資料,那很好。
我試過這個查詢
DECLARE @n INT = 7
SELECT * FROM Table1
WHERE [date] < Dateadd(day, -((@n (@n / 5) * 2)), Getdate())
但周六、周日的邏輯與我的邏輯不符。請提出更好的方法。
uj5u.com熱心網友回復:
您可以使用 CTE 標記目標日期,然后從表中洗掉所有其他日期,如下所示:
; With CTE As (
Select [Date], Row_number() Over (Order by [Date] Desc) As Num
From tbl
Where DATEPART(weekday, [Date]) Not In (6,7)
)
Delete From tbl
Where [Date] Not In (Select [Date] From CTE Where Num<=7)
如果表中的作業日數可能少于 7,并且您需要通過添加休息天數使總天數達到 7,請嘗試以下操作:
; With CTE As (
Select [Date], IIF(DATEPART(weekday, [Date]) In (6,7), 0, 1) As IsBusinessDay
From tbl
)
Delete From tbl
Where [Date] Not In (Select Top 7 [Date]
From CTE
Order by IsBusinessDay Desc, [Date] Desc)
uj5u.com熱心網友回復:
如果每天只有一個日期,您可以簡單地執行以下操作:
SELECT TOP 7 [Date] FROM Table1
WHERE
[Date] < GETDATE() AND DATENAME(weekday, [DATE]) NOT IN ('Saturday', 'Sunday')
ORDER BY
[DATE] DESC
uj5u.com熱心網友回復:
您可以從今天開始的第 7 個作業日作為
select top(1) cast(dateadd(d, -n 1, getdate()) as date) d
from (
select n
, sum (case when datename(dw, dateadd(d, -n 1, getdate())) not in ('Sunday', 'Saturday') then 1 end) over(order by n) wdn
from (
values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)
)t0(n)
) t
where wdn = 7
order by n;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380035.html
標籤:sql sql-server 约会时间 逻辑
