将日期部分小时转换为本地时区

lc8prwob  于 2022-10-22  发布在  其他
关注(0)|答案(1)|浏览(156)

有没有办法将这两个T-SQL查询组合起来?我正在使用SQL Server 2014。
目标是能够在转换后的本地时区中获得与UTC时间相反(或附加)的第一个查询的输出。基本上是在本地时区按小时汇总记录。

SELECT 
    DATEPART(HOUR, TimeUtc) AS UTCHour, Message, Application, 
    COUNT(Message) AS "Count"
FROM 
    [DB].[dbo].[TBL]
WHERE 
    timeutc BETWEEN '2022-10-21 00:00:00.000' AND '2022-10-21 23:59:59.000'
GROUP BY 
    DATEPART(HOUR, TimeUtc), Message, Application
HAVING 
    COUNT(Message) > 5
ORDER BY 
    UTCHour DESC, "Count" DESC
SELECT 
    CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, TimeUtc), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS ColumnInLocalTime 
FROM 
    [DB].[dbo].[TBL]
WHERE 
    timeutc BETWEEN '2022-10-21 00:00:00.000' AND '2022-10-21 23:59:59.000'

当前输出示例:(UTC小时表示TimeUTC字段的HH)

UTCHour消息应用程序计数
23请求失败。WebAppv10186756309
23HTTP 500.WebAppv1018521
22第8层错误。WebAppv10021
22ID10T错误。WebAppv10110

所需输出示例:(基本上23:00 UTC=16:00 PDT,我不关心格式,即16:00 vs 4PM等,只要输出是PDT格式)。

PDTHour消息应用程序计数
16请求失败。WebAppv10186756309
16HTTP 500.WebAppv1018521
15第8层错误。WebAppv10021
15ID10T错误。WebAppv10110
3htmauhk

3htmauhk1#

select dateadd(MINUTE,DATEPART(TZ,SYSDATETIMEOFFSET()),sysutcdatetime());

这将返回当前时区中的datetime字段,该字段是从sysutcdatetime中计算出来的,加上sysdatetimeoffset返回的分钟数。
注意:我不知道函数sysutcdatetimesysdatetimeoffset是否在SQL Server 2014中可用。
当您认为此功能太长而无法键入(或无法记住)时,可以为此创建一个函数:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[UTCtoLocale] 
(
    @p1 datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @Result datetime

    SELECT @Result = dateadd(MINUTE,DATEPART(TZ,SYSDATETIMEOFFSET()),@p1);

    RETURN @Result

END
GO

此后,SELECT dbo.UTCtoLocale(sysutcdatetime());应返回本地时间;
P.S.选择此函数的名称,当您知道更好的名称时,请随意更改它。😉
使用此函数的SQL查询:

SELECT 
    DATEPART(HOUR, dbo.UTCtoLocale(TimeUtc)) AS LocalHour, Message, Application, 
    COUNT(Message) AS "Count"
FROM 
    [DB].[dbo].[TBL]
WHERE 
    dbo.UTCtoLocale(timeutc) BETWEEN '2022-10-21 00:00:00.000' AND '2022-10-21 23:59:59.000'
GROUP BY 
    DATEPART(HOUR, dbo.UTCtoLocale(TimeUtc)), Message, Application
HAVING 
    COUNT(Message) > 5
ORDER BY 
    LocalHour DESC, "Count" DESC

此函数将根据本地日期“2022-10-21”获得结果,您的原始日期是今天的utc日期。

相关问题