【问题标题】:Remove minutes and seconds and then convert to UTC timezone删除分钟和秒,然后转换为 UTC 时区
【发布时间】:2022-01-03 00:26:18
【问题描述】:

我有这样的时间戳数据列

2021-12-09 08:01:00.520

我想删除分钟和秒,然后在一行中将日期转换为 UTC 时区。

我试过这个代码

 SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, Time_Stamp), 0) From Table1

我得到了这个结果

2021-12-09 08:00:00.000

我试过这段代码

SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), Time_Stamp)From Table1

我得到了这个结果

2021-12-09 16:01:00.520

我的预期是

2021-12-09 16:00:00.000

如何简单地将select语句合并为一行

【问题讨论】:

  • 你怎么知道原来的时区是什么?您不一定要依靠向后工作,因为您现在可能(不)在 DST 中,或者在 DST 更改时有时会重叠

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

将日期转换为字符串并截断以删除分钟和秒。然后添加您的时区和 UTC 之间的分钟差。

select dateadd(minute,datediff(minute,getdate(),getutcdate()),convert(datetime2(0),convert(varchar(13),getdate(),126)+':00:00',126));

【讨论】:

  • 我试过 select dateadd(hour,datediff(minute,getdate(),getutcdate()),convert(datetime2,convert(varchar(13),getdate(),126)+':00: 00',126));但我得到 2021-12-09 16:00:00.0000000。并不完全符合预期。如何删除尾随零?
  • datetime2 更改为datetime2(0)
  • 好的,我试过了,它有效。但我只是意识到日期没有更改为 UTC 时间 2021-12-09 08:00:00 应该是 2021-12-09 16:00:00
  • IMO 问题的整个前提是错误的,因为当前时区可能不是创建日期时的时区。如果您知道确切的偏移量,那么您可以使用AT TIME ZONE 'UTC' 进行转换,其他任何东西都没有意义
  • @Jimmy 我将 SQL-Server-2014 移动到它所属的 标记
【解决方案2】:

这是另一种方式。

要删除分钟、秒并只保留小时,您可以使用以下查询

DATEADD(HOUR, DATEDIFF(HOUR, 0, Time_Stamp), 0)

要转换为UTCDate,只需找到GETDATE()GETUTCDATE() 之间的小时()不同(因为您对分钟和秒都不感兴趣)并将其添加到上面的查询中

把所有东西放在一起

DATEADD(HOUR, DATEDIFF(HOUR, 0, Time_Stamp) + DATEDIFF(HOUR, GETDATE(), GETUTCDATE()), 0)

【讨论】:

    【解决方案3】:
    SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), dateadd(hour, datediff(hour, 0, Time_Stamp), 0)) FROM Table1
    

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2012-01-06
      • 2013-05-05
      相关资源
      最近更新 更多