TSQL DATETIME ISO 8601

时间:2009-05-01 20:55:34

标签: sql sql-server tsql datetime

我已经获得了一个需要ISO 8601日期格式的规范,是否知道转换代码或获取这两个示例的方法:

ISO 8601 Extended Date 2000-01-14T13:42Z 
ISO 8601 Basic Date 20090123T105321Z

7 个答案:

答案 0 :(得分:81)

在处理SQL Server中的日期时,ISO-8601格式可能是最好的方法,因为无论您的语言和文化设置如何,它都能正常工作。

为了将数据插入SQL Server表,您根本不需要任何转换代码或任何内容 - 只需将日期指定为文字字符串

INSERT INTO MyTable(DateColumn) VALUES('20090430 12:34:56.790')

你已经完成了。

如果您需要在SELECT上将日期列转换为ISO-8601格式,您可以使用转换代码126或127(带有时区信息)来实现ISO格式。

SELECT CONVERT(VARCHAR(33), DateColumn, 126) FROM MyTable

应该给你:

2009-04-30T12:34:56.790

答案 1 :(得分:20)

SELECT CONVERT(NVARCHAR(30), GETDATE(), 126)

会产生这个

2009-05-01T14:18:12.430

有关此问题的更多详细信息,请访问MSDN

答案 2 :(得分:11)

如果您只需要输出ISO8601格式的日期(包括尾随Z)并且至少在SQL Server 2012上,那么您可以使用FORMAT

SELECT FORMAT(GetUtcDate(),'yyyy-MM-ddTHH:mm:ssZ')

这会给你类似的东西:

2016-02-18T21:34:14Z

答案 3 :(得分:6)

天啊,不!如果您在SQL Server中存储格式化日期,那么您会要求一个受伤的世界。始终存储您的日期和时间以及SQL Server“日期/时间”数据类型之一(DATETIME,DATE,TIME,DATETIME2,等等)。让前端代码解析显示方法,并且只在构建临时表以构建文件时存储格式化日期。如果绝对必须从SQL Server显示ISO日期/时间格式,则只在显示时执行。我不能强调...不要在SQL Server中存储格式化的日期/时间。

{编辑}。原因很多,但最明显的是,即使有一个很好的ISO格式(可以排序),所有未来的日期计算和搜索(例如,搜索给定月份中的所有行)都需要至少一个隐含的转换(需要额外的时间),如果存储的格式化日期不是您当前需要的格式,则需要先将其转换为日期,然后再转换为您想要的格式。

前端代码也是如此。如果存储格式化日期(文本),则需要相同的旋转来显示由Windows或应用程序定义的本地日期格式。

我的建议是始终将日期/时间存储为DATETIME或其他时态数据类型,并且只在显示时格式化日期。

答案 4 :(得分:0)

在谈到ISO日期时,您在技术上有两个选择。

一般情况下,如果您仅在日期值上专门过滤或希望以中性方式保留日期。 Microsoft建议使用ymdy-m-d的语言中性格式。哪些都是有效的ISO格式。

  

请注意表格' 2007-02-12'被认为只是语言中立   对于数据类型DATE,DATETIME2和DATETIMEOFFSET。

因此,您最安全的选择是根据始终自然 ymd格式保留/过滤。

代码:

select convert(char(10), getdate(), 126) -- ISO YYYY-MM-DD
select convert(char(8), getdate(), 112) -- ISO YYYYMMDD (safest)

答案 5 :(得分:0)

对于Datetime和Datetime2的ISO 8601格式,以下是SQL Server的建议。它不支持日期时间(yyyyMMddThhmmss)的基本ISO 8601格式。

DateTime

YYYY-MM-DDThh:mm:ss [.mmm]

YYYYMMDD [hh:mm:ss [.mmm]]

示例:

  1. 2004-05-23T14:25:10

  2. 2004-05-23T14:25:10.487

Datetime2

YYYY-MM-DDThh:mm:ss [.nnnnnnn]

YYYY-MM-DDThh:mm:ss [.nnnnnnn] 例子:

  1. 2004-05-23T14:25:10

  2. 2004-05-23T14:25:10.8849926

您可以使用126选项进行转换

--Datetime

DECLARE @table Table(ExtendedDate DATETIME, BasicDate Datetime)

DECLARE @ExtendedDate VARCHAR(30) = '2020-07-01T08:39:17' , @BasicDate VARCHAR(30) = '2009-01-23T10:53:21.000'

INSERT INTO @table(ExtendedDate, BasicDate)
SELECT convert(datetime,@ExtendedDate,126) ,convert(datetime,@BasicDate,126)

SELECT * FROM @table
go

-- Datetime2

DECLARE @table Table(ExtendedDate DATETIME2, BasicDate Datetime2)

DECLARE @ExtendedDate VARCHAR(30) = '2000-01-14T13:42:00.0000000' , @BasicDate VARCHAR(30) = '2009-01-23T10:53:21.0000000'

INSERT INTO @table(ExtendedDate, BasicDate)
SELECT convert(datetime2,@ExtendedDate,126) ,convert(datetime2,@BasicDate,126)

SELECT * FROM @table
go

日期时间

+-------------------------+-------------------------+
|      ExtendedDate       |        BasicDate        |
+-------------------------+-------------------------+
| 2020-07-01 08:39:17.000 | 2009-01-23 10:53:21.000 |
+-------------------------+-------------------------+

Datetime2


+-----------------------------+-----------------------------+
|        ExtendedDate         |          BasicDate          |
+-----------------------------+-----------------------------+
| 2000-01-14 13:42:00.0000000 | 2009-01-23 10:53:21.0000000 |
+-----------------------------+-----------------------------+

答案 6 :(得分:0)

这是一个非常古老的问题,但是因为我来这里搜索时值得提出答案。

SELECT DATEPART(ISO_WEEK,'2020-11-13') AS ISO_8601_WeekNr