SQL Server 基于时区和偏移量的时差计算

ttp71kqs  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(156)

我们在近乎实时的数据仓库中将数据从Oracle SQL传输到SQL Server。(Oracle是一个事务数据库)我们使用的数据的时间每年更改两次。我们在计算日期时间差异时遇到了问题,我必须在需要建议的地方制定短期和长期解决方案。
1.新数据输入:我可以从头开始创建表,并对所有时间变量使用datetimeoffset数据字段。这是否会在SQL Server查询中以本地时区显示日期,并以实际UTC时间保存它们?当我计算差值时,它是否会给予正确的差值?
1.没有偏移信息的现有数据:我已经将数据转换为当前时区。我们有2个时区AEST和AEDT。当我们计算KPI的时差时,它给出了不正确的时间。您对如何解决这个问题有什么想法吗?创建一个函数,将日期和时间转换为UTC,减去时差并返回值是否可行?
示例如下:

DECLARE @startdate DateTime = '2022-10-01 23:13:00.000'; --UTC 2022-10-01 13:13:00.00
DECLARE @enddate DateTime = '2022-10-02 12:08:00.000' --UTC 2022-10-02 01:08:00.00
select CAST((@enddate - @startdate) as time(0)) 'Difference'

Time difference: 12:55:00

Actual Time Difference: 11:55:00
fcg9iug3

fcg9iug31#

对于您的示例,如果您在数据中包含时区信息,则日期计算将成功

DECLARE @startdate datetimeoffset(0) = '2022-10-01 23:13:00 +10:00'; --UTC 2022-10-01 13:13:00.00
DECLARE @enddate datetimeoffset(0) = '2022-10-02 12:08:00 +11:00' --UTC 2022-10-02 01:08:00.00

declare @minutes int =  datediff(minute, @startdate, @enddate);

select @startdate at time zone 'utc', 
   @enddate at time zone 'utc';

select [hours] = @minutes / 60,
    [minutes] = @minutes - 60 * (@minutes / 60)

要处理现有数据,您可以通过使用适当的时区名称在at time zone中运行它来一次性转换为datetimeoffset,在上面的示例中,我使用了UTC,但您可以在sys.time_zone_info中找到所有支持的时区。
关于你的第一个问题,关于内部存储格式和显示,我不确定它是否在内部使用UTC。至于显示,默认情况下,它会以你存储它们时使用的时区输出它们。也就是说,如果你存储了一个给定的值,并将+10:00作为偏移量,那么它将如何显示。你可以通过上面描述的方法或switchoffset()进行转换。最后,如果重要的话,你可以使用datepart只获得偏移量,注意它返回的是分钟数的偏移量(以符合需要返回int的datepart)。

相关问题