在查询SQL时将表达式转换为数据类型datetime的算术溢出错误

时间:2015-05-13 17:35:24

标签: sql jdbc

我在查询SQL中的某些数据时遇到问题。列数据类型为varchar,其日期时间戳作为其名称的一部分,如DUMMY2_20140713.pdf。

想要在星期持续时间之间搜索文件。所以尝试将部分文件名转换为日期,如下所示:

select file_name,file_name 
from t_pdf_weekly_violation 
where CONVERT(datetime, SUBSTRING(file_name, CHARINDEX('_', file_name) + 1, 8), 112) between 20150506 and 20150513;

但它正在抛出异常......请在下面找到堆栈跟踪:

  

com.microsoft.sqlserver.jdbc.SQLServerException:算术溢出   将表达式转换为数据类型datetime时出错。在   com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)     在   com.microsoft.sqlserver.jdbc.SQLServerResultSet $ FetchBuffer.nextRow(SQLServerResultSet.java:4700)     在   com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1683)     在   com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:956)     在databaseconnection.ConnectionURL.main(ConnectionURL.java:36)

对此有任何想法吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

无需将子字符串转换为Datetime,只需删除CONVERT(datetime

即可
SELECT file_name,file_name 
FROM t_pdf_weekly_violation 
WHERE SUBSTRING(file_name, CHARINDEX('_', file_name) + 1, 8) between 20150506 and 20150513;

Sample SQL FIDDLE

替代解决方案

如果您想使用CONVERT(datetime,则必须转换所有日期

SELECT file_name,file_name 
    FROM t_pdf_weekly_violation 
    WHERE CONVERT(datetime,SUBSTRING(file_name, CHARINDEX('_', file_name) + 1, 8),112) 
         between CONVERT(datetime,'20150506',112) and CONVERT(datetime,'20150510',112);

Sample SQL FIDDLE

答案 1 :(得分:0)

当我将返回类型datetime更改为char时,它正在工作,如

SELECT file_name,file_name 
    FROM t_pdf_weekly_violation 
    WHERE CONVERT(char(8),SUBSTRING(file_name, CHARINDEX('_', file_name) + 1, 8),112) 
         between CONVERT(char(8),'20150506',112) and CONVERT(char(8),'20150510',112);