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

Noo*_*ora -1 sql sql-server datetime sql-server-2008

我有一个表格,其中包含存储日期和时间的列.我需要编写一个查询来只获取该列的日期,

SELECT CAST(CONVERT(VARCHAR, LoginTime, 101) AS datetime) FROM AuditTrail 
Run Code Online (Sandbox Code Playgroud)

但是,当我运行查询时,我收到此错误:

将varchar数据类型转换为日期时间数据类型会导致超出范围的值.

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

你能帮我吗?

Sar*_*avu 8

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

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail 
WHERE ISDATE(LoginTime) = 1
Run Code Online (Sandbox Code Playgroud)

编辑:

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

SELECT CONVERT(VARCHAR, LoginTime, 101) FROM AuditTrail 
Run Code Online (Sandbox Code Playgroud)

要么

SELECT LEFT(LoginTime,10) FROM AuditTrail
Run Code Online (Sandbox Code Playgroud)

编辑2:

错误的主要原因将在WHERE子句中的日期.ie,

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

将与众不同

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

结论

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

将varchar数据类型转换为日期时间数据类型会导致超出范围的值.

因此,请确保使用mm/dd/yyyy或以dd/mm/yyyy格式过滤日期,无论哪种方式都适用于您的数据库.