TSQLdate时间ISO 8601
我已经给出了一个需要ISO 8601
date格式的规范,是否有人知道转换代码或获得这两个例子的方法:
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议使用ymd
或ymd
的语言中立格式。 哪些是有效的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)