我们最近将数据库迁移到了另一台服务器,因此我认为日期格式查询已经发生了某种变化。
以前我们可以使用以下内容..
SELECT * FROM table WHERE date > 'YYYY-MM-DD'
但是现在我们必须使用..
SELECT * FROM table WHERE date > 'YYYY-DD-MM'
有人可以告诉我需要更改什么才能恢复到以前的版本吗?
答案 0 :(得分:2)
试试这个 -
<强>查询:强>
SET DATEFORMAT ymd
阅读当前设置:
DBCC USEROPTIONS
<强>输出:强>
Set Option Value
-------------------------- -----------------
...
language us_english
dateformat ymd
...
答案 1 :(得分:2)
你是对的,服务器之间的日期格式不同。
如果您将日期文字指定为'YYYY-MM-DD'
,很多人会陷入假设,无论当前的日期格式如何,都会将其解释为。这是不正确的。 SQL Server在字符串的开头看到4位数,并正确推断它们代表年份。然而,它然后使用当前日期格式来告知月和日的哪个方向。例如,如果您在英国,这会让您处于尴尬境地,因为您需要DMY
的日期格式来解释日期文字,例如'DD-MM-YYYY'
,但日期格式为{{1}解释日期文字,如MDY
。
您有几种选择:
'YYYY-MM-DD'
,不要让用户以任何其他方式输入日期。SET DATEFORMAT YMD
。无论当前日期格式如何,都将正确解析。 {d'YYYY-MM-DD'}
具有相同的效果。答案 2 :(得分:2)
您是否为字符串使用不同的格式,然后您可以避免此行为。
有两种始终特定的iso格式 - 无论服务器日期格式设置如何,sql server都将以相同的方式解析它们。
这些是:
1)简短形式:YYYYMMDD。示例'20120301' - 2012年3月1日
2)长型:YYYY-MM-DDTHH:MM:SS.msms'。示例'2012-03-01T12:13:00.000Z' - 2012年3月1日12点(下午1点)13点
在长形式中,毫秒是可选的 - 这是一个完全可以接受的ISO日期时间'2012-03-01T12:13:00Z'
最后的Z是时区信息。 SQL Server实际上并不需要这个。 (虽然其他产品更严格一些)
试试这个例子:
DECLARE @foo DATETIME
SET DATEFORMAT DMY
-- this will be the 3rd of january in DMY
SET @foo = '2012-03-01'
SELECT 'DMY: Not ISO', @foo
SET @foo = '20120301'
SELECT 'DMY: ISO', @foo
SET DATEFORMAT MDY
-- this will be the 1st of March in MDY
SET @foo = '2012-03-01'
SELECT 'MDY: not ISO', @foo
SET @foo = '20120301'
SELECT 'MDY: ISO', @foo
当您使用文本输入日期时,总是尝试使用两种ISO标准之一。它只是让事情更加确定。
短格式(SQL Server) http://msdn.microsoft.com/en-US/library/ms187085(v=sql.90).aspx
ISO 8601格式(SQL Server) http://msdn.microsoft.com/en-us/library/ms190977(v=sql.90).aspx
答案 3 :(得分:0)
这是语言/文化的问题
Set Language 'us_english'