我在查询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)
对此有任何想法吗?
提前致谢
答案 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;
替代解决方案
如果您想使用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);
答案 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);