我在 SQL Server 中使用以下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 选择MYDATE
,我应该如何继续添加额外的小时/分钟数?
假设MYDATE
是一个datetimeoffset
:
使用datetimeoffset
时,您可以在日期中包含时区,SQL Server 将处理它。例如,下面的CASE
表达式返回@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()
,因为它也会返回一个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)))
请注意,DATEADD
WEEK
取决于语言,我不知道您的设置是什么,因此这可能不会为您提供所需的值,但会在正确的球场上。
如果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')