У меня очень странная проблема с запросом, который мне дали для преобразования из Access на SQL Сервер.
Запрос работает, как и ожидалось, до тех пор, пока я не добавлю условие в предложении WHERE для проверки указанного c date.
Я не был уверен, что поля даты были совместимы из-за запроса SQL Server, необходимого для связи со связанным мэйнфреймом DB2. Таким образом, чтобы проверить это, чтобы убедиться, что дата читается правильно, я использовал DATEDIFF()
. Я также сократил выражение select только до поля даты, в котором возникла проблема, чтобы попытаться выяснить, что происходит, но мне все еще не повезло. Я пытался найти способ фильтровать дату.
Я пытался HAVING
предложение.
HAVING TERM_DT = '9999-12-31'
Я пытался WHERE
предложение.
WHERE TERM_DT = '9999-12-31'
Я пытался сравнить дату в JOIN
.
INNER JOIN linked_db2_tbl11 tbl11
ON tbl11.TERM_DT = '9999-12-31'
Я пытался CAST
и CONVERT
поле с DATE, думая, что, возможно, поля даты были несовместимы.
CAST(TERM_DT AS DATE) = CAST('9999-12-31' AS DATE)
CONVERT(DATE, TERM_DT) = CONVERT(DATE, '9999-12-31')
В каждом из вышеперечисленных случаев я также пытался TERM_DT >= '9990-12-31'
, потому что ничего больше не работало, и по какой-то причине в этом столбце есть несколько опечаток, таких как 9998-12-31
и 9999-11-31
, поэтому я решил, что проверка с 9990
должна отловить все. Все еще ничего не возвращалось.
Последнее, что я попробовал, было DATEDIFF()
. И это тоже не сработало.
DATEDIFF(day, '9990-12-31', TERM_DT) >= 0
За исключением случаев, когда я поместил DATEDIFF()
в операторе select и ничего не использовал в разделе WHERE, я получил ожидаемые значения ...
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
Возвращенные данные:
DIFF DT
-2912352 2017-04-01
-2912261 2017-07-01
-2911852 2018-08-14
-2911852 2018-08-14
-2911624 2019-03-30
-2911624 2019-03-30
-2911532 2019-06-30
-2911532 2019-06-30
3287 9999-12-31
3287 9999-12-31
Но когда я добавляю оператор where в:
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
WHERE DATEDIFF(day, '9990-12-31', TERM_DT) >= 0
Я не получаю результатов:
DIFF DT
Затем я попытался отразить сравнение с <=
, и странно то, что я получил все значения ниже 9999-12-31
, как и ожидалось, так почему же я не могу получить значения на 9999-12-31
для возврата? Это очень странная ситуация.
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
WHERE DATEDIFF(day, '9990-12-31', TERM_DT) <= 0
Как ни странно, это сработало так, как должно:
DIFF DT
-2912352 2017-04-01
-2912261 2017-07-01
-2911852 2018-08-14
-2911852 2018-08-14
-2911624 2019-03-30
-2911624 2019-03-30
-2911532 2019-06-30
-2911532 2019-06-30
Так что я могу получить даты ниже 9999-12-31
, но не могу получить даты в 9999-12-31
. Когда я понял, что проверка дат ниже 9999-12-31
работает в функции DATEDIFF()
, я вернулся и попытался выполнить свое первоначальное сравнение и проверить эти меньшие даты. Это сработало ...
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
WHERE TERM_DT < '9999-12-31'
Результаты:
DIFF DT
-2912352 2017-04-01
-2912261 2017-07-01
-2911852 2018-08-14
-2911852 2018-08-14
-2911624 2019-03-30
-2911624 2019-03-30
-2911532 2019-06-30
-2911532 2019-06-30
С учетом вышеприведенных результатов у меня нет оснований думать, что WHERE TERM_DT = '9999-12-31'
не вернется:
DIFF DT
3287 9999-12-31
3287 9999-12-31
Но я этого не понимаю. Я ничего не получаю.
Обновление:
Я пробовал DATEDIFF(day, '9990-12-31', DH230.DH230_TERM_DT) <> 0
, так как @ Зиад Мехмуд упоминал, и странным образом я получаю все отрицательные значения, но ни одно из положительных значения.
DIFF DT
-2912352 2017-04-01
-2912261 2017-07-01
-2911852 2018-08-14
-2911852 2018-08-14
-2911624 2019-03-30
-2911624 2019-03-30
-2911532 2019-06-30
-2911532 2019-06-30
2-е обновление:
Когда я беру свое утверждение WHERE и перемещаю его в CASE в SELECT, оно четко работает. Сравнения верны. Но просто не работает в разделе WHERE.
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
,CASE WHEN DH230.DH230_TERM_DT >'2100-12-31' THEN 'True' else 'False' end
FROM ...
JOIN ...
Результаты:
DIFF DT (No column name)
-2911624 2019-03-30 False
-2911532 2019-06-30 False
-2912261 2017-07-01 False
-2912352 2017-04-01 False
3287 9999-12-31 True
3287 9999-12-31 True
-2911624 2019-03-30 False
-2911532 2019-06-30 False
-2911852 2018-08-14 False
-2911852 2018-08-14 False
Итак, еще один выстрел в темноте - я выполнил оператор CASE в предложении WHERE.
SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
WHERE CASE WHEN DH230.DH230_TERM_DT >'2100-12-31' THEN 'True' else 'False' end = 'True'
Но без результатов:
DIFF DT
Теперь вот оно снова становится странным:
WHERE CASE WHEN DH230.DH230_TERM_DT >'2100-12-31' THEN 'True' else 'False' end = 'False'
Возвращает:
DIFF DT
-2912352 2017-04-01
-2912261 2017-07-01
-2911624 2019-03-30
-2911532 2019-06-30
-2911624 2019-03-30
-2911532 2019-06-30
-2911852 2018-08-14
-2911852 2018-08-14
Абсолютно странно !
Существует ли какая-либо проблема между SQL Сервером и связанным мэйнфреймом DB2, которая может вызвать это?
Есть ли какая-либо причина, по которой это может произойти?
Я создал локальную таблицу SQL Server из оператора select для проверки типа данных поля.
Поле соответствует типу данных DATE в соответствии с SSMS.
![enter image description here](https://i.stack.imgur.com/9MROg.png)
Для справки я добавил свой полный запрос ниже с некоторым запутыванием. Возможно, что-то в JOIN вызывает проблему.