从varchar数据类型到datetime数据类型的转换产生一个超出该范围的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从varchar数据类型到datetime数据类型的转换产生一个超出该范围的值相关的知识,希望对你有一定的参考价值。

在使用公司的办公软件时,总是出现这个提示,导致我无法正常使用,无法办公了,求大神帮忙解决

提示很明显是在varchar类型转到datetime类型时出错,这个时间是你选择的还是输入的?
根据经验有可能是日期超出了范围。比如2月只有28天,要转换的varchar是'2015-02-30'这样的情况。或者出现'2015-04-31'类似的范围超出追问

软件里的时间是不需要我来设置的,而且同一款软件同事电脑都用的很正常,只有我的电脑不行,很郁闷

追答

关于日期的转换错误常见问题有三种。
第一种是试图转换不存在的日期。按照你说的情况是不存在的。
第二种是日期格式错误但是程序又没有格式化处理日期。比如本地使用长日期‘2015-03-05’ 程序转换使用‘25/03/05’类似问题。提示应该是转换失败。
第三种是本地日期和服务器时间没有同步,通常会导致查询不到数据。
你可以试一下把日期格式改成和同事相同,然后同步下时间。如果还不可以,那就不清楚为什么了。最彻底也是最无奈最万能的办法就是重装操作系统试试

参考技术A

应该是varchar里面的时间范围超出了datetime类型的范围,建议使用datetime2,。

背景知识

SQL Server 2008除了DateTime和SmallDateTime之外,又新增了四种时间类型,分别为:date,time,datetime2和datetimeoffset。

    各时间类型范围、精度一览表:

数据类型 时间范围 精度

datetime 1753-01-01到9999-12-31 00:00:00 到 23:59:59.997 3.33毫秒

smalldatetime 1900-01-01 到 2079-06-06 00:00:00 到 23:59:59 分钟

date 0001-01-01 到 9999-12-31 天

time 00:00:00.0000000 到 23:59:59.9999999 100 纳秒

datetime2 0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 100 纳秒

datetimeoffset 0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 -14:00 到 +14:00 100 纳秒

各时间类型表达式一览表:

    数据类型 输出

time 12:35:29. 1234567

date 2007-05-08

smalldatetime 2007-05-08 12:35:00

datetime 2007-05-08 12:35:29.123

datetime2 2007-05-08 12:35:29. 1234567

datetimeoffset 2007-05-08
12:35:29.1234567 +12:15

将 varchar 数据类型转换为 datetime 数据类型导致 SQL 查询中的值超出范围

【中文标题】将 varchar 数据类型转换为 datetime 数据类型导致 SQL 查询中的值超出范围【英文标题】:Conversion of a varchar data type to a datetime data type resulted in an out-of-range value in SQL query 【发布时间】:2015-02-02 05:05:41 【问题描述】:

我有一个表,其中有一列存储日期和时间。我需要编写一个查询以仅从该列中获取日期,

SELECT CAST(CONVERT(VARCHAR, LoginTime, 101) AS datetime) FROM AuditTrail 

但是,当我运行查询时,我收到了这个错误:

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

列中的数据是日期时间,例如:2012-06-18 12:08:04.000 所以我只需要提取日期并删除时间 注意 [Logintime] 列是数据时间格式

【问题讨论】:

向我们展示你拥有的 varchar 字段中的日期格式? 采用哪种日期格式?? How to select date without time in SQL 的可能重复项 这是日期的格式 [2012-06-18 12:08:09.000] 【参考方案1】:

在 SQL Server 中尝试ISDATE() 函数。如果为 1,则选择有效日期。如果 0 选择无效日期。

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail 
WHERE ISDATE(LoginTime) = 1
Click here查看结果

编辑:

根据您的更新我只需要提取日期并删除时间,然后您可以简单地使用内部CONVERT

SELECT CONVERT(VARCHAR, LoginTime, 101) FROM AuditTrail 

SELECT LEFT(LoginTime,10) FROM AuditTrail

编辑 2:

错误的主要原因将在您在 WHERE 子句中的日期。即,

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail
where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= 
CAST('06/18/2012' AS DATE)

将不同于

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail
where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= 
CAST('18/06/2012' AS DATE)

结论

EDIT 2中,第一个查询尝试以mm/dd/yyyy 格式过滤,而第二个查询尝试以dd/mm/yyyy 格式过滤。它们中的任何一个都会失败并抛出错误

导致将 varchar 数据类型转换为 datetime 数据类型 在一个超出范围的值。

因此,请确保使用mm/dd/yyyydd/mm/yyyy 格式过滤日期,无论哪个在您的数据库中有效。

【讨论】:

@sarath 发布的最后一个查询运行良好,但是当我使用 where 语句比较日期时它不起作用 SELECT CONVERT(VARCHAR, LoginTime, 101) FROM AuditTrail where CONVERT(VARCHAR, LoginTime, 101) 尝试 where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) @Noora 我收到 [从字符串转换日期和/或时间时转换失败。] 你能告诉我你想要做的查询吗? @Noora 上面写的相同查询【参考方案2】:

希望对您有所帮助:

SELECT  CAST(LoginTime AS DATE)
         FROM    AuditTrail 

如果你想在这个日期时间或不同部分有一些过滤器,你可以使用内置函数,例如年和月

【讨论】:

【参考方案3】:

正如您在这个问题的答案中看到的: Conversion of a varchar data type to a datetime data type resulted in an out-of-range value

-- set the dateformat for the current session
set dateformat dmy

-- The conversion of a varchar data type 
-- to a datetime data type resulted in an out-of-range value.
select cast('2017-08-13 16:31:31'  as datetime)

-- get the current session date_format
select date_format
from sys.dm_exec_sessions
where session_id = @@spid

-- set the dateformat for the current session
set dateformat ymd

-- this should work
select cast('2017-08-13 16:31:31'  as datetime)

【讨论】:

【参考方案4】:

我也遇到过同样的问题。我已经在 SQL Server 中以 'YYYY-MM-DD HH:NN:SS' 格式存储日期大约 20 年了,但今天,使用 OleDbCommand 和 UPDATE 查询的 C# 解决方案已经无法做到这一点了。

我的问题的解决方案是删除格式中的连字符 - ,因此生成的格式现在是 'YYYYMMDD HH:MM:SS'。我不知道为什么我以前的格式不再有效,但我怀疑与 ADO 的某些 Windows 更新有关。

【讨论】:

【参考方案5】:

有些问题,但我找到了解决办法,这是:


2 月 2 日 2 月 28 日(闰年 29)

这是我的代码

 public string GetCountArchiveByMonth(int iii)
        
// iii: is number of months, use any number other than (**2**)

            con.Open();

            SqlCommand cmd10 = con.CreateCommand();
            cmd10.CommandType = CommandType.Text;
            cmd10.CommandText = "select count(id_post) from posts where dateadded between CONVERT(VARCHAR, @start, 103) and CONVERT(VARCHAR, @end, 103)";
            cmd10.Parameters.AddWithValue("@start", "" + iii + "/01/2019");
            cmd10.Parameters.AddWithValue("@end", "" + iii + "/30/2019");
            string result = cmd10.ExecuteScalar().ToString();

            con.Close();

            return result;
        

现在进行测试

 lbl1.Text = GetCountArchiveByMonth(**7**).ToString();  // here use any number other than (**2**)

**

因为检查 **February** 已达到最大值 28 天,

**

【讨论】:

以上是关于从varchar数据类型到datetime数据类型的转换产生一个超出该范围的值的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel 导入 SQL Server:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

数据库出生日期用啥类型比较好?datetime 或 varchar

System.Data.SqlClient.SQLException:将 varchar 数据类型转换为 datetime

java 操作数据库时一个属性是DateTime类型的写入数据库时可弄成Varchar么

java 操作数据库时一个属性是DateTime类型的写入数据库时可弄成Varchar么

SQL Server 2008 中的 Varchar 到日期时间