SQL Server日期格式从字符串

时间:2013-07-09 11:38:30

标签: sql sql-server

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

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

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

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

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

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

4 个答案:

答案 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',不要让用户以任何其他方式输入日期。
  • 使用ODBC日期文字语法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'