Sql 日期时间介于

Sql 日期时间介于,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个疑问: SELECT * FROM QuestionnaireAnswer WHERE dateCreated BETWEEN CAST('20/12/2015' AS datetime) AND CAST('22/12/2015' AS datetime) 但我总是犯这个错误,怎么会呢?我该如何修复它 将varchar数据类型转换为datetime数据类型导致值超出范围 SQL Server支持多种格式-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效 解决

我有一个疑问:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('20/12/2015' AS datetime) AND CAST('22/12/2015' AS datetime)
但我总是犯这个错误,怎么会呢?我该如何修复它

将varchar数据类型转换为datetime数据类型导致值超出范围


SQL Server支持多种格式-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效

解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式,无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效。在您的具体案例中,使用以下
WHERE
条款:

WHERE dateCreated BETWEEN '20151220' AND '20151222'
您甚至不需要任何显式的
CAST
操作(或者如果您想使用显式的
CAST
,那么我建议您将其转换为
日期
数据类型,而不是
日期时间

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置

不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用
YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置


对于SQL Server 2008及更新版本,如果只需要日期部分,建议使用
DATE
;如果同时需要日期和时间,建议使用
DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰
日期时间
数据类型

SQL Server支持多种格式-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效

解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式
,无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效。在您的具体案例中,使用以下
WHERE
条款:

WHERE dateCreated BETWEEN '20151220' AND '20151222'
您甚至不需要任何显式的
CAST
操作(或者如果您想使用显式的
CAST
,那么我建议您将其转换为
日期
数据类型,而不是
日期时间

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置

不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用
YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置


对于SQL Server 2008及更新版本,如果只需要日期部分,建议使用
DATE
;如果同时需要日期和时间,建议使用
DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰
日期时间
数据类型

如果列是日期字段,那么您应该执行以下操作:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN TO_DATE('20-DEC-2015') AND TO_DATE('22-DEC-2015')

根据体系结构和配置,可能不是100%准确。

如果列是日期字段,则应执行以下操作:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN TO_DATE('20-DEC-2015') AND TO_DATE('22-DEC-2015')

根据体系结构和配置,可能不是100%准确。

在SQL Server中比较日期时,通常不使用特定于区域设置的格式,请使用通用
ISO 8601
格式
'yyyy/MM/dd'
,以便查询变成:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('2015/12/20' AS datetime) AND CAST('2015/12/22' AS datetime)

您也可以使用特定于区域设置的日期格式,但必须确保服务器上的日期格式在您的代码将连接到的所有服务器上始终保持相同

在SQL Server中比较日期时,通常不使用特定于区域设置的格式,请使用通用
ISO 8601
格式
'yyyy/MM/dd'
,以便查询变成:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('2015/12/20' AS datetime) AND CAST('2015/12/22' AS datetime)
您也可以使用特定于区域设置的日期格式,但必须确保服务器上的日期格式在您的代码将连接到的所有服务器上始终保持相同

使用,您可以编写如下内容:

SELECT * 
FROM QuestionnaireAnswer 
WHERE
dateCreated BETWEEN CONVERT(datetime, '20/12/2015', 103)
AND CONVERT(datetime, '22/12/2015', 103);
使用以下命令,您可以编写类似的内容:

SELECT * 
FROM QuestionnaireAnswer 
WHERE
dateCreated BETWEEN CONVERT(datetime, '20/12/2015', 103)
AND CONVERT(datetime, '22/12/2015', 103);

检查服务器上的区域设置。我敢打赌,您已设置为美国日期格式,但您在那里的日期不是美国格式

有关查询区域设置的详细信息。