我们在近乎实时的数据仓库中将数据从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
1条答案
按热度按时间fcg9iug31#
对于您的示例,如果您在数据中包含时区信息,则日期计算将成功
要处理现有数据,您可以通过使用适当的时区名称在
at time zone
中运行它来一次性转换为datetimeoffset
,在上面的示例中,我使用了UTC,但您可以在sys.time_zone_info
中找到所有支持的时区。关于你的第一个问题,关于内部存储格式和显示,我不确定它是否在内部使用UTC。至于显示,默认情况下,它会以你存储它们时使用的时区输出它们。也就是说,如果你存储了一个给定的值,并将+10:00作为偏移量,那么它将如何显示。你可以通过上面描述的方法或
switchoffset()
进行转换。最后,如果重要的话,你可以使用datepart
只获得偏移量,注意它返回的是分钟数的偏移量(以符合需要返回int的datepart)。