我们最近将我们的数据库迁移到了不同的服务器,因此我认为日期格式查询已经发生了某种变化。
以前我们可以使用以下..
SELECT * FROM table WHERE date > 'YYYY-MM-DD'
但是现在我们必须使用..
SELECT * FROM table WHERE date > 'YYYY-DD-MM'
有人可以告诉我需要更改什么才能恢复到以前的版本吗?
我们最近将我们的数据库迁移到了不同的服务器,因此我认为日期格式查询已经发生了某种变化。
以前我们可以使用以下..
SELECT * FROM table WHERE date > 'YYYY-MM-DD'
但是现在我们必须使用..
SELECT * FROM table WHERE date > 'YYYY-DD-MM'
有人可以告诉我需要更改什么才能恢复到以前的版本吗?
试试这个——
询问:
SET DATEFORMAT ymd
读取当前设置:
DBCC USEROPTIONS
输出:
Set Option Value
-------------------------- -----------------
...
language us_english
dateformat ymd
...
你是对的,服务器之间的日期格式不同。
许多人陷入假设如果您将日期文字指定为 的陷阱'YYYY-MM-DD'
,它将被解释为无论当前日期格式如何。这是不正确的。SQL Server 看到字符串开头的 4 位数字,并正确推断出它们代表年份。但是,它会使用当前的日期格式来判断月份和日期的方向。例如,如果你在英国,这会让你陷入尴尬的境地,因为你需要一个日期格式来DMY
解释像.'DD-MM-YYYY'
MDY
'YYYY-MM-DD'
你有几个选择:
SET DATEFORMAT YMD
,并且不要让用户以任何其他方式输入日期。{d'YYYY-MM-DD'}
。无论当前日期格式如何,这都将被正确解析。CONVERT(DATE, 'YYYY-MM-DD', 120)
有同样的效果。您是否对字符串使用不同的格式,那么您可以避免这种行为。
有 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 点过 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
这是语言/文化的问题
Set Language 'us_english'