TSQL 日期时间 ISO 8601

问题描述 投票:0回答:7

我收到了一份需要

ISO 8601
日期格式的规范,有人知道转换代码或获取这两个示例的方法吗:

ISO 8601 Extended Date 2000-01-14T13:42Z 
ISO 8601 Basic Date 20090123T105321Z
sql sql-server t-sql datetime
7个回答
126
投票

在 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

33
投票

这个

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

会产生这个

2009-05-01T14:18:12.430

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


31
投票

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

FORMAT
:

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

这会给你类似的东西:

2016-02-18T21:34:14Z

正如 @Pxtl 在评论中指出的那样,FORMAT 可能会对性能产生影响,与它带来的任何灵活性相比,必须考虑这一成本。


9
投票

天哪,不!!! 如果您将格式化日期存储在 SQL Server 中,那么您将面临巨大的伤害。 始终存储日期和时间以及 SQL Server“日期/时间”数据类型之一(DATETIME、DATE、TIME、DATETIME2 等)。 当您构建临时表来构建文件时,让前端代码解析显示方法并仅存储格式化日期。 如果您绝对必须显示 SQL Server 中的 ISO 日期/时间格式,则仅在显示时执行此操作。 我怎么强调都不为过...不要在 SQL Server 中存储格式化的日期/时间。

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

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

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


1
投票

从技术上讲,当谈到 ISO 日期时,您有两种选择。

一般来说,如果您仅专门针对 Date 值进行过滤,或者希望以中性方式保留日期。 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)

0
投票

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

日期时间

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

YYYYMMDD[时:分:秒[.mmm]]

示例:

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

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

日期时间2

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 |
+-------------------------+-------------------------+

日期时间2


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

0
投票
SELECT DATEPART(ISO_WEEK,'2020-11-13') AS ISO_8601_WeekNr
© www.soinside.com 2019 - 2024. All rights reserved.