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/yyyy
和
WHERE
子句包含
(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-YYYY
01-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呢?
分配“dd/MM/yyyy”数据时的日期时间,但它保存为“MM/dd/yyyy”