【问题标题】:Get Datetime in 8601 format from SQL Server从 SQL Server 获取 8601 格式的日期时间
【发布时间】: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 谢谢。我之前确实看到过这个答案,但我怎样才能得到时区部分?

标签: sql sql-server datetime


【解决方案1】:

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


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

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

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

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

这告诉我们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: 1) 我很确定,否则FORMAT 将不起作用(根据 OP,它确实起作用)。 OP 只是有一个(常见的)误解,即日期时间以某种格式存储(显然不是)。
  • @paulsm4: 2) 但我在回答中添加了一条评论,指出“默认”日期时间类型不存储时区信息。
  • 感谢您的澄清。这种“常见的误解”绝对不仅仅是一个“小问题”。了解如何有效地使用日期时间值非常重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多