在SQL Server中将日期时间值设置为变量的正确方式

13

可能重复:
最佳方式将字符串转换为日期并进行验证

在SQL Server中将datetime值分配给datetime变量时,出于文化无关原因,采用哪种格式最好?为什么?

下面的日期意为2013年12月1日。

DECLARE @myDate DATETIME
SET @myDate = '2013-12-01'
SET @myDate = '20131201'
SET @myDate = '12/01/2013'
SET @myDate = '2013-12-01T00:00:00.000'
SET @myDate = '2013-12-01T00:00:00'

如果 @myDate 是 DATETIME2 类型,你的答案会有所不同吗?

3个回答

15

根据 ISO 8601 标准,问题中的下列三种格式都是有效的:

DECLARE @myDate DATETIME
SET @myDate = '20131201'
SET @myDate = '2013-12-01T00:00:00.000'
SET @myDate = '2013-12-01T00:00:00'

使用 ISO 8601 格式的优点在于它是一个国际标准。此外,使用这种格式指定的日期时间值是明确无误的,并且不受 SET DATEFORMAT 或 SET LANGUAGE 设置的影响。


(SELECT r.date_format FROM master.sys.dm_exec_requests r WHERE r.session_id = @@SPID)返回**dmy**时,它无法工作。 - myro

3

这个问题以前已经讨论过,例如 最佳日期字符串转换和验证方法

ISO-8601格式的日期只有YYYYMMDD,带时间的日期为YYYY-MM-DDTHH:mm:ss

如果无法保证使用ISO格式,则应事先设置适用的DATEFORMAT

编辑

关于datetime2,是的,实际上MSDN 在此处明确说明了。由于精度增加到100纳秒,因此ISO 8601格式为YYYY-MM-DDTHH:mm:ss[.nnnnnnn]


-2

SET @myDate = '2013-12-01T00:00:00.000'

SET @myDate = '2013-12-01T00:00:00'

SET @myDate = '2013-12-01'

这些是根据ISO 8601的正确格式。


7
实际上,如果您的变量是 DATETIME 类型而您只想设置日期,那么正确的格式应该是 SET @myDate = '20131201'。您最后的赋值语句并不安全,在欧洲语言环境下会失败。 - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接