从 SQL Server 获取 8601 格式的日期时间

Posted

技术标签:

【中文标题】从 SQL Server 获取 8601 格式的日期时间【英文标题】:Get Datetime in 8601 format from SQL Server 【发布时间】:2021-06-03 18:04:12 【问题描述】:

我的表以以下通用格式存储日期时间:

2021-03-13 21:29:51.000

我怎样才能得到这种格式的日期

2021-03-13T21:00-04:00

我试过这个:

SELECT FORMAT (FromDateTime, 'yyyy-MM-ddTHH:00') 
FROM [table] 

我得到这个结果:2021-03-13T13:00

如何获取时区信息?

【问题讨论】:

SQL Server 应该如何知道时区? 魔术 @GordonLinoff . @GordonLinoff 我可以不使用与服务器本身相同的时区吗? @paulsm4 谢谢。我之前确实看到过这个答案,但我怎样才能得到时区部分? 【参考方案1】:

首先,一个小问题:“我的表以以下通用格式存储日期时间:” 嗯,不。如果您使用 datetime 类型的字段,则该值以某种 二进制 格式存储,您提到的格式只是 SQL Server Management Studio 呈现给您的“默认”格式。


话虽如此,让我们开始工作吧。授人以鱼不如授人以鱼,所以我将详细解释其中涉及的研究步骤。

所以你想添加时区信息。我们看一下T-SQL的FORMAT函数的文档:

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

格式参数必须包含有效的 .NET Framework 格式字符串,[...] 一个很好的起点是主题“格式化类型”。

点击“格式化类型”上的链接将我们带到https://docs.microsoft.com/en-us/dotnet/standard/base-types/formatting-types,其中包含一个名为“自定义日期和时间格式字符串”的链接,最终将我们带到

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

这告诉我们zzz 是时区格式说明符:

SELECT FORMAT(FromDateTime,'yyyy-MM-ddTHH:00zzz') FROM [table] 

现在,由 SQL Server 确定的时区值完全有可能不是正确的(尤其是如果您使用不存储时区信息的数据类型,例如 datetime;您需要 datetimeoffset为了那个原因)。因此,如果您想使用 固定值 -04:00,可以通过将其添加到格式字符串的末尾来完成:

SELECT FORMAT(FromDateTime,'yyyy-MM-ddTHH:00-04:00') FROM [table] 

【讨论】:

我们需要确保 1) OP 已正确定义列(例如,作为二进制 datetime),2) OP 了解存储在服务器上的相应日期时间值与时间无关区域! @paulsm4: 2) 不一定:docs.microsoft.com/en-us/sql/t-sql/data-types/… @paulsm4: 1) 我很确定,否则FORMAT 将不起作用(根据 OP,它确实起作用)。 OP 只是有一个(常见的)误解,即日期时间以某种格式存储(显然不是)。 @paulsm4: 2) 但我在回答中添加了一条评论,指出“默认”日期时间类型不存储时区信息。 感谢您的澄清。这种“常见的误解”绝对不仅仅是一个“小问题”。了解如何有效地使用日期时间值非常重要。

以上是关于从 SQL Server 获取 8601 格式的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从busybox中的“日期”获取ISO8601秒格式?

使用 ISO-8601 格式的 date-fns 获取当前日期

Sql中怎么样获取Datetime中的日

获取ISO8601格式的时间

在 Delphi 中复制 SQL Server DATEPART(wk, ...) 函数

sqlserver日期计算的问题