我有一个 SQL Server 2012 表,其中包含一个DateTime
列UTCDate
。在此列中,我以格林威治时区保存日期和时间,当我从此表中选择查询时,我想按客户端时区仅获取此表的最后 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