【问题标题】:Obtain the offset from a Sql server Datetime从 Sql server Datetime 获取偏移量
【发布时间】:2014-07-12 10:49:32
【问题描述】:

我需要从表中恢复日期时间并将其转换为 DateTimeOffset,但我需要使用正确的偏移量而不是当前偏移量保存这些值 例如:

(西班牙时区示例)

  • 如果我恢复2014/04/13 00:00:00,我需要2014/04/13 00:00:00 +02:00
  • 如果我恢复2014/02/13 00:00:00,我需要2014/02/13 00:00:00 +01:00

我知道如何使用 C#,但我需要知道是否可以使用 Sql Server,因为我必须通过将大量数据从具有 datetime 字段的数据库移动到具有 datetimeoffset 的数据库来进行迁移字段。

非常感谢!

【问题讨论】:

  • 为什么 4 月 13 日 +02:00 和 2 月 13 日 +01:00 的偏移量是正确的? current offset 是什么意思?
  • 你想对模棱两可的时间做什么? (即2013-10-27T02:30:00你想要什么?)
  • 在示例中,我使用的是西班牙时区,因此时间更改为(今年)3 月 30 日。这是更改前后日期的示例。
  • 关于模棱两可的时代,这是我必须解决的问题,但首先我想知道是否有“sql-server 方式”可以做到这一点,或者我必须使用 CLR例如函数。

标签: sql-server datetime datetimeoffset


【解决方案1】:

您需要处理模棱两可的时间,正如@Damien_The_Unbeliever 提到的,但这里是计算偏移量的方法(假设您的日期 >=1998)

SELECT YourDate,
       CASE WHEN YourDate < LocalSummerTimeStart 
                 OR YourDate > LocalSummerTimeEnd
            THEN 1
            ELSE 2
       END AS Offset
FROM YourTable
     CROSS APPLY (
         SELECT YEAR(YourDate) * 10000 +  300 + (31 - ((((5 * YEAR(Yourdate)) / 4) + 4) % 7)) AS UTCSummerTimeStartDate
               ,YEAR(YourDate) * 10000 + 1000 + (31 - ((((5 * YEAR(YourDate)) / 4) + 1) % 7)) AS UTCSummerTimeEndDate
     ) AS CA1
     CROSS APPLY (
         SELECT DATEADD(hour, 2, CONVERT(datetime, CONVERT(varchar(8), UTCSummerTimeStartDate), 112)) AS LocalSummerTimeStart
               ,DATEADD(hour, 3, CONVERT(datetime, CONVERT(varchar(8), UTCSummerTimeEndDate), 112)) AS LocalSummerTimeEnd
     ) AS CA2

european summer time formulas

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2015-05-21
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多