将这段代码放入查询分析器并点击F5。
declare @aaa datetime
set @aaa='01/12/2011'
set dateformat dmy
select month(@aaa)
它给你1.再次按F5,它给你12.为什么?
答案 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 post和this article by Tibor Karaszi。