CURRENT_UTC_TIME和时区问题

时间:2014-06-23 00:35:21

标签: sql sql-server timezone

我希望你能理解并帮助我。

我的Sql Server在南非(GMT + 2)

我的申请是在美国(GMT-6)

我的客户(移动)在南非,现在在巴西(GMT-4)。

表中记录的LastUpdateTime应该是上午10:25,而客户时间是凌晨4:25。此时服务器指示凌晨2:25(或类似的东西)

我教过我可以在sql中使用GETUTCDATE函数进行插入。但我的问题是:

  1. 如何自动将所有旧记录“LastUpdateTime转换为UTC日期?

  2. 这个转换是个好主意,还是我可以在应用程序中进行?

  3. 如何在web.config文件appSetting部分中允许配置服务器时区(这是为了在每次服务器时区更改时提及)?

1 个答案:

答案 0 :(得分:3)

有两种不同的方式可以存储像LastUpdateTime这样的值:

  • 就UTC而言,位于datetimedatetime2字段
  • 就当地时间而言,在datetimeoffset字段

如果您已将当地时间存储在datetime字段中,则该值可能不明确。转换为UTC将需要外部了解原始数据的捕获方式。

如果SQL的GETDATE语句捕获了这些值,则SQL Server的时区是相关的。南非的时间总是UTC + 02:00,所以你可以:

  • 将值保留在同一字段中并减去两小时以调整为UTC
  • ,将值复制到datetimeoffset字段,保留orignal值并使用UTC + 02:00偏移。

但是,如果该值是在另一个时区获得的,那么您需要知道该时区。您可能还遇到夏令时问题,因为许多时区未固定为单个偏移。

你说申请是在美国GMT-6,但这没有意义。美国的中部时间在UTC-06:00和UTC-05:00之间交替,而美国的Mountain Time在UTC-07:00和UTC-06:00之间交替。您需要知道它是哪个时区,然后由于fall-back daylight saving time transition,您必须为潜在的重叠做好准备。

关于是否对web.config文件 - 这更像是一个ASP.Net问题,而不是一个SQL Server问题。但是,我现在可以告诉你,没有神奇的配置设置来做到这一点。您的应用必须使用DateTime正确使用DateTimeKind.Utc,或使用DateTimeOffset,您可能需要TimeZoneInfo进行转换。在这里提供更好的建议是不可能的,因为你没有展示任何代码,这是一个非常广泛的主题。