从 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
函数的文档:
格式参数必须包含有效的 .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 格式的日期时间的主要内容,如果未能解决你的问题,请参考以下文章
使用 ISO-8601 格式的 date-fns 获取当前日期