SQL Server dateformat可疑行为

时间:2012-02-21 15:00:37

标签: sql-server

将这段代码放入查询分析器并点击F5。

declare @aaa datetime
set @aaa='01/12/2011'
set dateformat dmy
select month(@aaa)

它给你1.再次按F5,它给你12.为什么?

2 个答案:

答案 0 :(得分:1)

这是因为你的行set dateformat dmy已经完成了一半。

这是在第一个'F5'的初始分配后切换你的日期格式,但是第二个'F5'持续存在

如果你把它作为第一行它应该是一致的,每次返回12

要明确 - set dateformat dmy会对set @aaa='01/12/2011'行产生影响,因为它会影响字符串'01/12/2011'被解析为日期时间的方式。

在第一次运行时,@ aaa实际上将包含日期'12 -Jan-2011',而在set dateformat dmy之后它将包含日期'01 -Dec-2011'。

答案 1 :(得分:1)

因为第一次运行代码时,日期在内部存储为1月12日。设置设置适合您的会话,然后您再次运行它,因此您重新声明了变量,这次它被解释为12月1日。设置设置不会影响MONTH()之类的日期部分功能,因为日期已经被解释,并且不会按照您键入的方式在内部存储。

不应使用区域和模糊格式声明日期文字,而应始终使用安全,明确的格式。对于datetime / smalldatetime:

yyyymmdd
yyyy-mm-ddThh:mm:ss

约会:

yyyy-mm-dd

如果您想以这些友好但令人困惑的格式显示日期,请务必在表示层执行此操作。但是不要试图将SQL Server与它们混淆。请阅读this blog postthis article by Tibor Karaszi