【问题标题】:Using SQL Server datetimeoffset使用 SQL Server 日期时间偏移
【发布时间】:2015-03-07 22:08:56
【问题描述】:

我正在尝试存储在工具中设置的会议的日期、时间和时区。我允许用户指定日期和时间以及从时区列表中选择。

我的问题是试图弄清楚如何获取所有 3 个部分并将其格式化为正确的 datetimeoffset 进行存储。

我相信这是 SQL Server 对datetimeoffset 需要的格式:

YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm]

我的第一个问题是我的时区下拉列表的值应该是什么?

其次,SQL Server 中是否有内置方法来传递此数据字符串并将其转换为datetimeoffset 所需的格式?

【问题讨论】:

  • 日期的格式为 no。它们是二进制值。格式仅在转换/解析字符串时适用。使用参数化查询和 datetimeoffset 类型的参数,您根本不需要解析
  • 太棒了,所以现在我只需要弄清楚如何生成带有偏移值的时区列表;谢谢!
  • @SBB DateTimeOffset 仅包括偏移量,不包括时区。除了 Windows(操作系统)之外的每个人都使用 tzData 数据库。查看 Jon Skeet 的 NodaTime 库,它处理时区、偏移量并包含 tzdata
  • 这就是我的意思,我将向用户展示一个时区列表,但该值将是偏移量,它将结合日期和时间使用以提供datetimeoffset,对吗?

标签: sql-server tsql date datetime


【解决方案1】:

如果您的工具可以将时间转换为字符串,请将其转换为您包含的格式。 [.nnnn] 部分是纳秒级的。我还没有看到需要这种准确度的应用程序。如果你秒级准确率没问题,datetimeoffset(0) 就够了。

例子:

DECLARE @time_str varchar(30) = '2015-01-19 7:20:00 -08:00'
DECLARE @time datetimeoffset(0) = CONVERT(datetimeoffset, @time_str)

SELECT DATEPART(YEAR, @time),
       DATEPART(MONTH, @time),
       DATEPART(DAY, @time),
       DATEPART(HOUR, @time),
       DATEPART(MINUTE, @time),
       DATEPART(SECOND, @time),
       DATEPART(TZOFFSET, @time)

【讨论】:

    【解决方案2】:

    是的,DateTimeOffset 正是您想要的。

    其次,可用偏移量的选择列表应来自 ISO 列表 (http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)

    SQL Server 不关心时区偏移是否存在于现实世界中,它只需要有效。以下是几个示例:

    CREATE TABLE #tmp1 (dto DATETIMEOFFSET);
    
    INSERT INTO #tmp1 ( dto ) VALUES  ( SYSDATETIMEOFFSET() ) --system timestamp
    INSERT INTO #tmp1 ( dto ) VALUES  ( '2015-01-19 7:20:00 -08:00' ) --valid date, time, and offset
    INSERT INTO #tmp1 ( dto ) VALUES  ( '2015-01-19 7:20:00 -08:16' ) --vaid date, valid time, made up offset that doesn't exist in the real world.
    
    SELECT *
    FROM #tmp1
    

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2011-07-20
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2013-09-13
      • 2019-04-09
      相关资源
      最近更新 更多