TSQL: ошибка арифметического переполнения, преобразующая выражение в тип данных datetime

#sql #tsql #jdbc

#sql #tsql #jdbc

Вопрос:

Я пытаюсь выполнить этот простой запрос, чтобы получить сумму всех сумм за прошлый год и получить ошибку. Может кто-нибудь пролить свет на это, пожалуйста. Я не выполняю никакого приведения, а столбец TX_DATE имеет тип date.

 SELECT SUM(AMOUNT) as TOTAL
FROM
    TRANSACTIONS
WHERE
    ID = '12345'
    AND TYPE = 'Amount'
    AND DATEDIFF(MONTH,TX_DATE,GETDATE()) <= 12
  

Ошибка:

 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Arithmetic overflow error converting expression to data type datetime.
    at   com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4853)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1781)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1034)
    at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
    at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:91)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:1)
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:446)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396)
    ... 50 more
  

Комментарии:

1. Может ли TX_DATE быть типом поля, отличным от DATE или DATETIME?

2. ДА. Действительно. Его nvarchar в UAT env и Date в моем собственном evn 😉

3. Кажется, он содержит мусорные даты, тогда … 🙂

4. Поскольку вы используете Datediff для datepart month, вероятность возврата значения, которое находится вне диапазона для int, сомнительна. Это единственный запрос, который запускается, или это часть какого-то большого запроса. Также узнайте максимальные и минимальные даты TX_DATE из таблицы ТРАНЗАКЦИЙ. Может быть, это помогает.

Ответ №1:

Проверьте тип TX_DATE . Кажется, это не дата.

Комментарии:

1. Действительно, TX_DATE не имеет типа date (проверено после того, как я опубликовал вопрос). То, что мне до сих пор не ясно, заключается в том, почему запрос не завершается с ошибкой при запуске через Microsoft SQL Server Management Studio, но завершается с ошибкой при запуске через jdbc.

2. Это две разные системы, поэтому все зависит от того, как было интерпретировано значение TX_DATE .