【问题标题】:SQL time in incorrect from that of my system timezoneSQL 时间与我的系统时区不正确
【发布时间】:2021-08-05 09:46:26
【问题描述】:

我们有一个 SQL 数据库,它返回格林威治标准时间 (GMT) 的所有时间。我们位于东部标准时区 (EST)。这会弄乱我们从特定日期提取数据的一些查询。我尝试使用 (StartTime AT TIME ZONE 'Eastern Standard Time' 作为 StartTime_ET,但这只会返回与 GMT -5 相同的结果。我只希望确切的结果在 EST 中。

这改变了我的完整逻辑过程。有什么办法吗?

【问题讨论】:

  • 按格林威治标准时间,我假设您是指UTC? (有些人全年都称英国格林威治标准时间,但事实并非如此)。还是您的主机实际上是在观察英国时间,而现在 BST (UTC+1) 也是如此?
  • 嗨拉努,不,它在格林威治标准时间本身。我们只遵循 EST 时区。我的系统和向数据库发送数据的应用程序也在 EST 时区。希望有帮助吗?
  • “不,它是格林威治标准时间本身” 所以 UTC,因为 GMT 是 UTC+0。
  • 哦,好吧,有什么我可以转换的吗?我的应用设置显示为:时区:(UTC-05:00)东部时间(美国和加拿大)
  • 我已经发布了答案。

标签: sql sql-server timestamp-with-timezone


【解决方案1】:

假设您的值都是 UTC 并且您的列 StartTime 不是 datetimeoffset,那么您需要先将您的值变成 datetimeoffset,然后再更改时区.当您在不是 DATETIMEOFFSET 的日期和时间数据类型上使用AT TIMEZONE 时,假定该值已经在正确的时区。因此,例如 SELECT GETUTCDATE() AT TIME ZONE 'Eastern Standard Time'; 之类的东西现在会返回 2021-08-05 09:53:56.8500000 -04:00,即使现在 EST 中的时间实际上是 2021-08-05 05:53:56.8500000 -04:00

因此,您需要先添加偏移量,然后再使用AT TIME ZONE。所以,GETUTCDATE 会是这样的:

SELECT SWITCHOFFSET(GETUTCDATE(),0) AT TIME ZONE 'Eastern Standard Time';

因此,想必你只需要对你的专栏做同样的事情,StartTime,这也是一个UTC时间:

SWITCHOFFSET(StartTime,0) AT TIME ZONE 'Eastern Standard Time'

如果您不想要时区部分,则可以将其转换回不同的日期和时间数据类型:

CONVERT(datetime2(0),SWITCHOFFSET(StartTime,0) AT TIME ZONE 'Eastern Standard Time')

【讨论】:

  • 对不起,结果是 'yyyy-MM-dd' 格式,但我希望它与系统格式 'MM-dd-yyyy' 一样,有什么办法吗?
  • @NishanthiSankar 日期和时间数据类型没有格式。格式化是在表示层中完成的,而不是在 RDBMS 中。由您的应用程序决定显示的格式。
  • 我知道了 Larnu,但是当我执行此查询时我能够获得 EST 时区,但我也得到 -4 在单独的日期和时间方面,这会影响我导入到我的应用
  • ...阅读整个答案@NishanthiSankar ... “如果您不想要时区部分,那么您可以将其转换回不同的日期和时间数据类型:” ...我带你去水边,但我不能强迫你喝水;你需要自己做。
  • 你能不能也用StartTime AT TIME ZONE 'UTC'代替SWITCHOFFSET(StartTime, 0)
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2011-02-26
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多