【问题标题】:UTC and offset date time compare in sql serversql server中的UTC和偏移日期时间比较
【发布时间】:2018-06-05 12:44:23
【问题描述】:

我将 UTC 日期时间存储在数据库中

例如

2018-06-05 11:37:00.000 (UTC)

2018-06-05 17:07(+5:30 印度标准时间)

我的偏移量为:

偏移为 +02:00

如何在现在偏移时间匹配的 sql 查询中进行比较?

例如

2018-06-05 13:37:00.000

我的问题是 X (IST) 日期时间转换为 UTC,现在我想转换到不同的时区 (Y)

【问题讨论】:

  • 最近才在 2016 年引入了对 AT TIME ZONE 等 TZ 功能的新支持。通常,将 TZ 逻辑保留在应用程序层中并仅以 UTC 存储日期是个好主意。如果您的交易特定于某个位置或用户,那么您需要知道该 TZ 才能进行转换。仅应用 2 小时偏移量的问题是 DST 的不同时间,如果 TZ 遵守它的话。您必须记录哪个时区遵守 DST 以及该遵守何时开始和结束。它变得更加丑陋,因为 DST 时间表会随着时间和偏移量而变化。
  • 我的问题是 X (IST) 日期时间转换为 UTC,现在我想转换到不同的时区 (Y)

标签: sql sql-server sql-server-2008 tsql sql-server-2012


【解决方案1】:

以下函数帮助我解决了这个问题:

1. SWITCHOFFSET

2。 TODATETIMEOFFSET

SELECT GETDATE()
SELECT SWITCHOFFSET(GETDATE(), '+05:30')  
SELECT CONVERT(VARCHAR(19), SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(), '+05:30'),'+00:00'), 120)
SELECT GETUTCDATE()

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您可以使用 DATEADD 函数根据 UTC 日期时间和偏移量计算新的日期时间

    例如:

    2 小时 = 120 分钟

    DATEADD(minute, 120, '2018-06-05 11:37:00.000')
    

    或使用小时

    DATEADD(hour, 2, '2018-06-05 11:37:00.000')
    

    你也可以使用负数来换一种方式

    您不必使用文字值,您可以为参数 3 提供列名以在查询中使用,也可以将此表达式用作 where 子句的一部分


    这是 DATEADD 函数的备忘单:

    https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-2017

    【讨论】:

    • 我的问题是 X (IST) 日期时间转换为 UTC,现在我想转换到不同的时区 (Y)
    • 您仍然可以使用 DATEADD 函数来解决这些差异。如果您将该值存储为 UTC,要转换为另一个时区,您只需添加或减去该时区与 UTC 的距离。因此对于 IST(+05:30 或 330 分钟),您将使用 DATEADD(minutes, 330, UTCDateColumn)
    猜你喜欢
    • 2023-03-20
    • 2011-07-20
    • 1970-01-01
    • 2015-03-07
    • 2015-06-15
    • 2018-03-10
    • 2016-09-19
    • 2018-07-29
    相关资源
    最近更新 更多