SQL Server语言 - 在格林威治保存日期时间,但在选择查询时,按客户端时区选择特殊日期



我有一个 SQL Server 2012 表,其中包含一个DateTimeUTCDate。在此列中,我以格林威治时区保存日期和时间,当我从此表中选择查询时,我想按客户端时区仅获取此表的最后 24 小时数据列表,但我不知道该怎么做。

例如,客户端时区是

德黑兰 (+3:30),服务器时区是 UTC (0:00)

我想要选择只获取特殊行,例如星期六在客户端而不是在服务器中

请帮助我

谢谢

我认为您必须将数据与GETUTCDATE()一起保存到服务器
您必须添加列以保存以下代码的客户端时区C#

DateTimeOffset dof = new DateTimeOffset(DateTime.Now);

当你想要选择数据可以使用这个

Declare @offset='+03:30';
Select * from TableName where 
DateDiff(hour,switchoffset (CONVERT(datetimeoffset, UTCDate), @offset),
switchoffset (CONVERT(datetimeoffset, GETUTCDATE()), @offset))<24 

请注意,必须从客户端偏移量设置@offset C#

您可以使用日期时间偏移量列将日期和时间存储为 UTC 来存储数据。例如:

DECLARE @DataSource TABLE
(
    [DateTime] DATETIMEOFFSET
);
DECLARE @CurrentUTCDate DATETIMEOFFSET = GETUTCDATE();
INSERT INTO @DataSource ([DateTime])
VALUES (DATEADD(HOUR, -4, @CurrentUTCDate))
      ,(DATEADD(HOUR, -8, @CurrentUTCDate))
      ,(DATEADD(HOUR, -12, @CurrentUTCDate))
      ,(DATEADD(HOUR, -16, @CurrentUTCDate))
      ,(DATEADD(HOUR, -20, @CurrentUTCDate))
      ,(DATEADD(HOUR, -24, @CurrentUTCDate))
      ,(DATEADD(HOUR, -36, @CurrentUTCDate))
      ,(DATEADD(HOUR, -72, @CurrentUTCDate));

然后,有了您当前的用户时区,您可以使用 SWITCHOFFSET 函数轻松转换UTC日期:

SELECT SWITCHOFFSET([DateTime], '-08:00' )
FROM @DataSource

例如,让我们有下表,其中包含 UTC 日期:

DECLARE @DataSource TABLE
(
    [DateTime] DATETIMEOFFSET
);
DECLARE @CurrentUTCDate DATETIMEOFFSET = GETUTCDATE();
INSERT INTO @DataSource ([DateTime])
VALUES (DATEADD(HOUR, -4, @CurrentUTCDate))
      ,(DATEADD(HOUR, -8, @CurrentUTCDate))
      ,(DATEADD(HOUR, -12, @CurrentUTCDate))
      ,(DATEADD(HOUR, -16, @CurrentUTCDate))
      ,(DATEADD(HOUR, -20, @CurrentUTCDate))
      ,(DATEADD(HOUR, -24, @CurrentUTCDate))
      ,(DATEADD(HOUR, -36, @CurrentUTCDate))
      ,(DATEADD(HOUR, -72, @CurrentUTCDate));

您当前的用户时区为 +02:00 。因此,下一条语句返回转换为用户时区的UTC日期:

SELECT [DateTime] AS [UTC Zone]
      ,CAST(SWITCHOFFSET([DateTime], '+02:00' ) AS DATETIME2) AS [User Zone]
FROM @DataSource

如果您需要过滤记录,仅显示过去24:00小时,则可以使用DATEDIFF功能:

DECLARE @CurrentUserDate DATETIME2 = SWITCHOFFSET(@CurrentUTCDate, '+02:00');
SELECT [DateTime] AS [UTC Zone]
      ,CAST(SWITCHOFFSET([DateTime], '+02:00' ) AS DATETIME2) AS [User Zone]
      ,@CurrentUserDate AS [Current User Date]
      ,DATEDIFF(HOUR, @CurrentUserDate, CAST(SWITCHOFFSET([DateTime], '+02:00' ) AS DATETIME2)) AS [Diff]  
FROM @DataSource
WHERE DATEDIFF(HOUR, @CurrentUserDate, CAST(SWITCHOFFSET([DateTime], '+02:00' ) AS DATETIME2)) >= -24

可以帮助您从UTC日期时间获取本地日期时间。

SELECT Dateadd(mi, Datediff(mi, Getutcdate(), Getdate()), UTCDate)
FROM   tablename 

相关内容

  • 没有找到相关文章

最新更新