SQL Server:特定日期时区中特定时间的日期范围



我在 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)))

请注意,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')

相关内容

最新更新