5

我们最近将我们的数据库迁移到了不同​​的服务器,因此我认为日期格式查询已经发生了某种变化。

以前我们可以使用以下..

SELECT * FROM table WHERE date > 'YYYY-MM-DD'

但是现在我们必须使用..

SELECT * FROM table WHERE date > 'YYYY-DD-MM'

有人可以告诉我需要更改什么才能恢复到以前的版本吗?

4

4 回答 4

2

试试这个——

询问:

SET DATEFORMAT ymd

读取当前设置:

DBCC USEROPTIONS

输出:

Set Option                 Value
-------------------------- -----------------
...
language                   us_english
dateformat                 ymd
...
于 2013-07-09T11:40:49.607 回答
2

你是对的,服务器之间的日期格式不同。

许多人陷入假设如果您将日期文字指定为 的陷阱'YYYY-MM-DD',它将被解释为无论当前日期格式如何。这是不正确的。SQL Server 看到字符串开头的 4 位数字,并正确推断出它们代表年份。但是,它会使用当前的日期格式来判断月份和日期的方向。例如,如果你在英国,这会让你陷入尴尬的境地,因为你需要一个日期格式来DMY解释像.'DD-MM-YYYY'MDY'YYYY-MM-DD'

你有几个选择:

  • SET DATEFORMAT YMD,并且不要让用户以任何其他方式输入日期。
  • 使用 ODBC 日期文字语法{d'YYYY-MM-DD'}。无论当前日期格式如何,这都将被正确解析。CONVERT(DATE, 'YYYY-MM-DD', 120)有同样的效果。
  • 从查询中删除所有文字值并改用参数。这是迄今为止最好的选择,我强烈推荐它。
于 2013-07-09T11:45:22.897 回答
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 点过 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

于 2013-07-09T12:16:25.973 回答
0

这是语言/文化的问题

Set Language 'us_english'
于 2013-07-09T11:40:43.600 回答