TSQLdate时间ISO 8601

我已经给出了一个需要ISO 8601date格式的规范,是否有人知道转换代码或获得这两个例子的方法:

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

在处理SQL Server中的date时,ISO-8601格式可能是最好的select,因为它可以工作,不pipe你的语言和文化设置如何。

为了将数据插入到SQL Server表中,您不需要任何转换代码或任何东西 – 只需将date指定为文字string

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

你完成了。

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

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

应该给你:

 2009-04-30T12:34:56.790 

这个

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

会产生这个

 2009-05-01T14:18:12.430 

关于这一点的更多细节可以在MSDN上find。

如果您只需输出包含尾随Z的ISO8601格式的date,并且至less在SQL Server 2012上,则可以使用FORMAT

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

这会给你类似的东西:

2016-02-18T21:34:14Z

天哪,不! 如果您在SQL Server中存储格式化的date,那么您正在寻求一个让世界受到伤害的世界。 始终存储date和时间以及SQL Server“date/时间”数据types(DATETIME,DATE,TIME,DATETIME2等)之一。 让前端代码parsing显示的方法,并且只有在构build临时表来构build文件时才存储格式化的date。 如果您绝对必须从SQL Server显示ISOdate/时间格式,则只能在显示时间进行。 我无法强调…不要在SQL Server中存储格式化的date/时间。

{编辑}。 原因很多,但最明显的是,即使有一个很好的ISO格式(这是可sorting的),所有未来的date计算和search(例如search给定月份中的所有行)将需要至less一个隐式转换(需要额外的时间),如果存储的格式化date不是您当前需要的格式,则需要先将其转换为date,然后转换为所需的格式。

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

我的build议是始终将date/时间存储为DATETIME或其他时间数据types,并只在显示时间格式化date。

说起ISOdate,在技术上有两个select。

一般来说,如果你是专门过滤date值,或者希望以中立的方式保存date。 Microsoftbuild议使用ymdymd的语言中立格式。 哪些是有效的ISO格式。

请注意,表单“2007-02-12”仅针对数据typesDATE,DATETIME2和DATETIMEOFFSET,被认为是语言中立的。

正因为如此,你最安全的select是基于永远 ymd格式来坚持/过滤。

代码:

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