使用 SQL 服务器日期时间偏移

Using SQL Server datetimeoffset

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

我的问题是想弄清楚如何把所有 3 个部分都格式化成正确的 datetimeoffset 来存储。

我相信这是 SQL 服务器 datetimeoffset 需要的格式:

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

我的第一个问题是我的时区下拉值应该是多少?

其次,SQL服务器是否有内置的方式来传递这串数据并将其转换为datetimeoffset所需的格式?

如果您的工具可以将时间转换为字符串,请将其转换为您包含的格式。 [.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)

是的,DateTimeOffset 正是您想要的。

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

SQL 服务器不关心现实世界中时区偏移量是否存在,只需要有效即可。这里有几个示例:

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