SQL 服务器:特定日期时区特定时间的日期范围

SQL Server: date range at a specific time in time zone on specific day

我在 SQL 服务器中使用以下 WHERE 条件来确定特定时区(这里是科威特)从上一周的周五(午夜)到周六(午夜)的日期范围

WHERE 
    MYDATE BETWEEN (DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 4) AT TIME ZONE  'Arab Standard Time') 
               AND (DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 5) AT TIME ZONE  'Arab Standard Time')

如果我不得不从周五午夜到周六 5:00 科威特时间 select MYDATE,我应该如何继续将额外的 hours/minutes 添加到上面?

假设 MYDATEdatetimeoffset:

使用 datetimeoffset 时,您可以在日期中包含时区,SQL 服务器会处理它。例如下面的 CASE 表达式 returns @SomeDate 的值:

DECLARE @SomeDate datetimeoffset = '2019-12-28T20:30:31+00:00';

SELECT CASE WHEN @SomeDate >= '2019-12-28T21:00:00+01:00' AND @SomeDate < '2019-12-28T22:00:00+01:00' THEN @SomeDate END;

假设您 运行 的查询来自阿拉伯标准时间的某个位置,您最好使用 SYSDATETIMEOFFSET 而不是 GETDATE(),因为它 returns 还有一个 datetimeoffset:

WHERE MYDATE >= DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK, 6, SYSDATETIMEOFFSET()), 0))
      AND MYDATE < DATEADD(HOUR,5,DATEADD(DAY,6,DATEADD(WEEK, DATEDIFF(WEEK, 6, SYSDATETIMEOFFSET()), 0)))

注意,DATEADDWEEK 是语言相关的,我不知道你的设置是什么,所以这可能不会给你你想要的价值, 但会在正确的球场.

如果 MYDATE 是 UTC 时间(在多个时区处理数据的另一种常见方式),而不是 datetimeoffset,那么您可以使用 SWITCHOFFSET 来更改创建它们后的时间:

WHERE MYDATE >= SWITCHOFFSET(DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK, 6, SYSDATETIMEOFFSET()), 0)),'+00:00')
      AND MYDATE < SWITCHOFFSET(DATEADD(HOUR,5,DATEADD(DAY,6,DATEADD(WEEK, DATEDIFF(WEEK, 6, SYSDATETIMEOFFSET()), 0))),'+00:00')