代码之家  ›  专栏  ›  技术社区  ›  852post

上周日至下周日

  •  0
  • 852post  · 技术社区  · 1 年前

    我试图在凌晨3点检索最近的一个星期天,直到即将到来的星期天凌晨2:59。

    下面是我所拥有的,但它并没有准确地检索到即将到来的周日。理想情况下,每当我运行此查询时,它都应该为我提供预期的结果。例如,如果我今天运行此查询,它应该返回StartDate:8/25/2024 3:00 AM和EndDate:9/1/2024 2:59 AM,而如果我下周运行,它应该为我提供StartDate:9/1/024 3:00 AM和End Date: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
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   testing-for-ya    1 年前

    首先,在今天凌晨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));
    

    结果:

    起始范围 ProposeEnd HokeyEnd
    2024-08-25 03:00:00.000 2024-09-01 03:00:00.000 2024-09-01 02:59:00.000

    如果你想星期一而不是星期天,那就换吧 1 - 在4号线上 2 - :