使用 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
我正在尝试存储在工具中设置的会议的日期、时间和时区。我允许用户从时区列表中指定日期和时间以及 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