MM/dd/yyyy 日期时间数据类型导致值超出范围

Posted

技术标签:

【中文标题】MM/dd/yyyy 日期时间数据类型导致值超出范围【英文标题】:MM/dd/yyyy datetime data type resulted in an out-of-range value 【发布时间】:2018-08-13 08:51:02 【问题描述】:

我正在输入 2 个日期值以便从 SQL 查询中过滤掉。

 EXEC [Report].[usp_EmployeeReport_Detail] '01-01-2017','31-08-2019'

我将日期输入为MM/dd/yyyyWHERE 子句包含

(j.StartDate BETWEEN @BegDate AND @EndDate)

执行查询时出现以下错误。

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

我也尝试使用以下方式转换日期时间结果。

SELECT CONVERT(datetime,01-31-2017,101)

这将返回 1894-05-25 00:00:00.000 作为响应。怎么可能?

【问题讨论】:

因为1 减去31 等于-30,再从这个数字中减去2017 年就得到-2047。 1894 年 5 月 25 日是(我强烈猜测)SQL Server 的 0 日期 1900-01-01 前 2047 天。如果您从其他程序传递此值,请调查是否有比将其作为字符串传递给 SQL Server 更好的语言绑定(甚至在最后一个示例中,甚至不将其视为字符串) 您使用的是哪个 dbms? (该代码是特定于产品的。) 【参考方案1】:

正如@Damien_The_Unbeliever 所说,01-31-2017 使用数值表达式,其计算结果为-2047

-2047 表示从1900-01-01 减去2047 天数,因此日期结果将为1894-05-25 00:00:00.000

所以您的查询SELECT CONVERT(datetime,01-31-2017,101)SELECT CONVERT(datetime,-2047,101) 相同

sqlfiddle


您可以使用符合 ANSI 的格式YYYYMMDD

SELECT CONVERT(datetime,'20170131',101);

而不是

DD-MM-YYYY01-31-2017.

或者只是添加' 以包含日期'01-31-2017' 就像@fa06 回答一样。

【讨论】:

【参考方案2】:

试试这个:你错过了日期的报价:

SELECT CONVERT(datetime,'01-31-2017',101)

【讨论】:

【参考方案3】:

试试下面的方法

SELECT CONVERT(CHAR,GETDATE(),1 )

it returns 08/13/18

在您的情况下,您错过了作为结果输出显示的引用

【讨论】:

以上是关于MM/dd/yyyy 日期时间数据类型导致值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

混合和匹配数据类型以生成所需的日期格式 mm/dd/yyyy

SQL SERVER中日期的显示格式为YYYY-MM-DD,怎样设置为MM/DD/YYYY呢?

删除占位符输入类型日期的 mm/dd/yyyy

分配“dd/MM/yyyy”数据时的日期时间,但它保存为“MM/dd/yyyy”

如何在 libreoffice calc 中将日期格式从 MM/DD/YYYY 更改为 DD/MM/YYYY?

SSRS 2008 R2-格式参数为DD / MM / YYYY