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

时间:2019-12-28 20:10:29

标签: sql-server timezone where-in

我在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,我该如何在上面增加额外的小时/分钟?

1 个答案:

答案 0 :(得分:2)

假设MYDATEdatetimeoffset

使用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')