根据SQL Server中的科威特时区筛选日期

问题描述

我有以下查询,旨在计算从上一个(上一个)星期六的00:00:00到一天结束(星期日00:00:00)的用户存款

我的日期列(简称为“ datetime”)不包含任何时区详细信息(例如:2020-09-11 21:52:37.803)。不过,它是基于我的服务器所在的拉脱维亚/里加时区的。

当基于星期六00:00:00和星期日00:00:00之间的日期时间过滤我的行时,我没有考虑到我不需要根据拉脱维亚时间(服务器时间)过滤此日期这一事实,但是在另一个时间,即我的客户所在的“阿拉伯标准时间”区域。

今天,我的sql日期列时区和阿拉伯时区相等(UTC +3),但是在冬天,该时区之间的时间会有所不同。

我该如何应对这两个时区之间的潜在时差,并确保尽管基于拉脱维亚时间,但我始终根据科威特时间00:00:00和星期日00:00:00进行过滤?我应该使用AT TIME_ZONE还是将日期时间偏移以反映阿拉伯时区的小时?

 SELECT 
      UserID,SUM (DEPOSIT) AS deposits 
    FROM 
      (
        SELECT 
          UserID,datetime,CASE WHEN TranType = 'DEPOSIT' THEN AmountReal ELSE 0 END AS DEPOSIT 
        FROM 
          datafeed 
        WHERE 
          datetime >= CAST (
            CAST (
              IIF (
                0 = DATEPART(
                  dw,GETDATE()
                ),GETDATE(),DATEADD(
                  d,(
                    (
                      (
                        7 + 0 - DATEPART(
                          dw,GETDATE()
                        )
                      ) % 7
                    ) -7
                  ),GETDATE()
                )
              ) AS DATE
            ) AS datetime
          ) --last saturday at 00:00 0=saturday
          AND datetime <= CAST (
            CAST (
              IIF (
                1 = DATEPART(
                  dw,(
                    (
                      (
                        7 + 1 - DATEPART(
                          dw,GETDATE()
                )
              ) AS DATE
            ) AS datetime
          ) 
      ) alltrans 
    GROUP BY 
      UserID

解决方法

我建议您将数据存储在UTC中。这样,无论时区如何,您都不会遇到问题。

将现有时间戳转换为UTC。如您所知,时间在拉脱维亚时区,因此您可以轻松地进行转换并存储在UTC中。将来,通过将UTC时间转换为客户所居住的相应阿拉伯时区来运行所有查询。 DateTimeOffset数据类型不支持DST。您需要在冬季进行相应处理,在转换日期时间的同时应用相应的偏移量。

您可以使用TODATETIMEOFFSET来应用来自UTC的转换。

DECLARE @todaysDateTime datetime2;  
SET @todaysDateTime = GETUTCDATE()
SELECT TODATETIMEOFFSET (@todaysDateTime,'+03:00');