SQL 时间与我的系统时区不正确
Posted
技术标签:
【中文标题】SQL 时间与我的系统时区不正确【英文标题】:SQL time in incorrect from that of my system timezone 【发布时间】: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)东部时间(美国和加拿大) 我已经发布了答案。 【参考方案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)
以上是关于SQL 时间与我的系统时区不正确的主要内容,如果未能解决你的问题,请参考以下文章