2015-05-13 49 views
0

我在查询SQL中的某些数据时遇到问题。列数据类型是varchar,它具有日期时间戳作为其名称的一部分,如DUMMY2_20140713.pdf。在查询SQL时将表达式转换为数据类型datetime的算术溢出错误

要搜索的周日期之间的文件duration.so试图文件名的一部分转换为日期如下:

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; 

但它扔exception..Please找到下面的堆栈跟踪:

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)

对此有任何想法?

在此先感谢

+0

只要注意,为什么两次' file_name'在查询中的选择列表中 – HaveNoDisplayName

+0

'CONVERT(datetime'替换为'CONVERT(int' –

+0

Piyush:取文件名的子字符串,所以使用file_name两次。 – user3863488

回答

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

0

它工作时,我改变了返回式日期时间为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); 
相关问题