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

将varchar数据类型转换为datetime数据类型导致SQL查询中的值超出范围,sql,sql-server,sql-server-2008,datetime,Sql,Sql Server,Sql Server 2008,Datetime,我有一个表,其中有一列存储日期和时间。我需要写一个查询,只从该列中获取日期 SELECT CAST(CONVERT(VARCHAR, LoginTime, 101) AS datetime) FROM AuditTrail 但是,当我运行查询时,会出现以下错误: 将varchar数据类型转换为datetime数据类型导致值超出范围 列中的数据为datetime ex:2012-06-18 12:08:04.000 所以我只需要提取日期并删除时间 请注意,[Logintime]列是datati

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

SELECT CAST(CONVERT(VARCHAR, LoginTime, 101) AS datetime) FROM AuditTrail 
但是,当我运行查询时,会出现以下错误:

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

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

请尝试SQL Server中的ISDATE函数。如果为1,请选择有效日期。如果0选择了无效日期

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

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

编辑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)
结论

在编辑2中,第一个查询尝试以mm/dd/yyyy格式进行筛选,而第二个查询尝试以dd/mm/yyyy格式进行筛选。它们中的任何一个都将失败并抛出错误

结果将varchar数据类型转换为datetime数据类型 在超出范围的值中


因此,请确保使用mm/dd/yyyy或dd/mm/yyyy格式过滤日期,以数据库中的任何一种格式为准

希望这可以帮助您:

SELECT  CAST(LoginTime AS DATE)
         FROM    AuditTrail 

如果您想在此日期时间或其不同部分上设置一些过滤器,可以使用内置函数,如年和月,如您在回答此问题时所看到的:

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

2月2日2月28日29闰年

这是我的密码

现在进行测试

**

由于支票**2月**最长为28天


**我也遇到了同样的问题。我已经在SQL Server中以“YYYY-MM-DD HH:NN:SS”格式存储了大约20年的日期,但是今天,在使用OleDbCommand和更新查询的C解决方案中,这已经无法实现


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

显示您在varchar字段中的日期格式?在哪种日期格式中?可能重复的是日期的格式[2012-06-18 12:08:09.000]@sarath发布的最后一个查询工作正常,但当我使用where语句比较日期时,它不是wokring从AuditTrail中选择CONVERTVARCHAR,LoginTime,101,其中CONVERTVARCHAR,LoginTime,101尝试使用where CASTCONVERTVARCHAR,LoginTime,101作为我获取的日期[从字符串转换日期和/或时间时,转换失败。]您能告诉我您正在尝试执行的查询吗?@no或上面写的相同查询
SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail
where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= 
CAST('18/06/2012' AS DATE)
SELECT  CAST(LoginTime AS DATE)
         FROM    AuditTrail 
-- 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)
 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**)