【问题标题】:Arithmetic overflow error converting expression to data type datetime while querying SQL查询 SQL 时将表达式转换为数据类型 datetime 的算术溢出错误
【发布时间】:2015-05-13 17:35:23
【问题描述】:

我在从 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:算术溢出 将表达式转换为数据类型日期时间时出错。在 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)

对此有任何想法吗?

提前致谢

【问题讨论】:

  • 请注意,为什么在查询的选择列表中出现两次file_name
  • CONVERT(datetime 替换为CONVERT(int
  • Piyush : 取文件名的子字符串,所以使用了两次 file_name。
  • Lashane :我尝试用 int 替换 datetime,但仍然显示异常
  • @user3863488:- 我不是在谈论子字符串,我的意思是在您的查询中指出此代码select file_name,file_name

标签: sql jdbc


【解决方案1】:

不需要将子字符串转换为日期时间,只需删除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

【讨论】:

    【解决方案2】:

    当我将返回类型 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2011-10-07
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多