我正在尝试检索最近的最后一个星期日凌晨 3 点,直到即将到来的星期日凌晨 2:59。
对于此请求,我不应该使用任何使用 DECLARE 或 INSERT 的方法。
下面是我所拥有的,但它不能准确检索即将到来的周日。理想情况下,每当我运行此查询时,它都应该为我提供预期的结果。例如,如果我今天运行此查询,它应该返回 StartDate: 8/25/2024 3:00 AM 和 EndDate: 9/1/2024 2:59 AM 而如果我下周运行,它应该为我提供 StartDate: 9/1/2024 3:00 AM 和结束日期:9/8/2024 2:59 AM
一个主要问题是,我是否要在周日运行此查询。有些地方一周从周日开始,而另一些地方则从周一开始,因此查询应考虑到这一点并得到周日 - 周日的结果。
select dateadd(hour,3,dateadd(minute, 00, DATEADD(dd, DATEDIFF(dd,-1,GETDATE())/7*7,-1))) StartDate,
dateadd(hour,+2,dateadd(minute, +59, dateadd(day, ((15-@@datefirst) - datepart(dw, getdate())) % 7, convert(char(12), getdate())))) EndDate
首先,找到今天凌晨 3 点:
DECLARE @today datetime = DATEADD(HOUR, 3,
CONVERT(datetime, CONVERT(date, GETDATE())));
然后取您想要的星期几(在本例中星期日 = 1),并计算前一天。无论
DATEFIRST
设置如何,此公式都有效。
DECLARE @PreviousSunday datetime = DATEADD(DAY,
1 - (DATEPART(WEEKDAY, @today) + @@DATEFIRST) % 7, @today);
现在您只需添加一周即可获得另一个范围(如果必须的话,可以再次使用
DATEADD
减去一分钟,但这是不明智的,因为您会错过 2:59 到 3:00 之间发生的数据) .
SELECT StartRange = @PreviousSunday,
ProperEnd = DATEADD(DAY, 7, @PreviousSunday),
HokeyEnd = DATEADD(MINUTE, -1, DATEADD(DAY, 7, @PreviousSunday));
大家一起:
DECLARE @today datetime = DATEADD(HOUR, 3,
CONVERT(datetime, CONVERT(date, GETDATE())));
DECLARE @PreviousSunday datetime = DATEADD(DAY,
1 - (DATEPART(WEEKDAY, @today) + @@DATEFIRST) % 7, @today);
SELECT StartRange = @PreviousSunday,
ProperEnd = DATEADD(DAY, 7, @PreviousSunday),
HokeyEnd = DATEADD(MINUTE, -1, DATEADD(DAY, 7, @PreviousSunday));
结果:
开始范围 | 正确结局 | HokeyEnd |
---|---|---|
2024-08-25 03:00:00.000 | 2024-09-01 03:00:00.000 | 2024-09-01 02:59:00.000 |
如果您想要周一而不是周日,只需将第 4 行的
1 -
更改为 2 -
: