我已经获得了一个需要ISO 8601
日期格式的规范,是否知道转换代码或获取这两个示例的方法:
ISO 8601 Extended Date 2000-01-14T13:42Z
ISO 8601 Basic Date 20090123T105321Z
答案 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)
答案 2 :(得分:11)
如果您只需要输出ISO8601格式的日期(包括尾随Z)并且至少在SQL Server 2012上,那么您可以使用FORMAT
:
SELECT FORMAT(GetUtcDate(),'yyyy-MM-ddTHH:mm:ssZ')
这会给你类似的东西:
2016-02-18T21:34:14Z
答案 3 :(得分:6)
{编辑}。原因很多,但最明显的是,即使有一个很好的ISO格式(可以排序),所有未来的日期计算和搜索(例如,搜索给定月份中的所有行)都需要至少一个隐含的转换(需要额外的时间),如果存储的格式化日期不是您当前需要的格式,则需要先将其转换为日期,然后再转换为您想要的格式。
前端代码也是如此。如果存储格式化日期(文本),则需要相同的旋转来显示由Windows或应用程序定义的本地日期格式。
我的建议是始终将日期/时间存储为DATETIME或其他时态数据类型,并且只在显示时格式化日期。
答案 4 :(得分:0)
在谈到ISO日期时,您在技术上有两个选择。
一般情况下,如果您仅在日期值上专门过滤或希望以中性方式保留日期。 Microsoft建议使用ymd
或y-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格式。
YYYY-MM-DDThh:mm:ss [.mmm]
YYYYMMDD [hh:mm:ss [.mmm]]
示例:
2004-05-23T14:25:10
2004-05-23T14:25:10.487
YYYY-MM-DDThh:mm:ss [.nnnnnnn]
YYYY-MM-DDThh:mm:ss [.nnnnnnn] 例子:
2004-05-23T14:25:10
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