上周日到即将到来的周日时间

问题描述 投票:0回答:1

我正在尝试检索最近的最后一个星期日凌晨 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
sql sql-server date time range
1个回答
0
投票

首先,找到今天凌晨 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 -
:

© www.soinside.com 2019 - 2024. All rights reserved.