WHERE DATE_COLUMN = '9999-12-31' оператор заставляет запрос не возвращать результатов - PullRequest
1 голос
/ 18 февраля 2020

У меня очень странная проблема с запросом, который мне дали для преобразования из 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

Для справки я добавил свой полный запрос ниже с некоторым запутыванием. Возможно, что-то в JOIN вызывает проблему.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Репликация

Create Table [DateTest] (
    [date] date NOT NULL
)

insert into [dateTest] ([date])
values 
('2017-04-01'),
('2017-07-01'),
('2018-08-14'),
('2018-08-14'),
('2019-03-30'),
('2019-03-30'),
('2019-06-30'),
('2019-06-30'),
('9999-12-31'),
('9999-12-31')

SELECT DATEDIFF(day, '9990-12-31', dt.[Date]) AS "DIFF"
,dt.[Date] as [DT]
FROM [dateTest] as DT

Диагностика c

При репликации вашего утверждения (цитируется) я запустил следующее:

"Но когда я добавляю оператор where в: "

SELECT DATEDIFF(day, '9990-12-31', dt.[Date]) AS "DIFF"
,dt.[Date] as [DT]
FROM [dateTest] as DT
WHERE DATEDIFF(day, '9990-12-31', dt.[Date]) >= 0

Я получил ожидаемое возвращение:

DIFF    DT
3287    9999-12-31
3287    9999-12-31

Синтаксис для вашего SQL правильный, однако возможно проблема с типом данных. Можете ли вы предоставить дополнительную информацию о таблицах для запросов?


Запрос дополнительной информации

Идеальным вариантом будет простой случай для определений таблиц или просто простой пример строки из 2 таблицы, к которым вы хотите присоединиться, и типы данных.

Трудно повторить ваш вопрос, не зная точного определения вашего файла доступа. В указанном сценарии слишком много таблиц, чтобы изолировать их без прямого клонирования. Создав упрощенный пример, вы сможете решить свою проблему.


Рекомендация

Если это однократное преобразование из базы данных на основе Access, вы можете посмотреть на SSMS ( Sql Server Management Studio) для использования прямого импорта для доступа к базам данных.

Если вы ищете способ планирования извлечения из известного файла Access, каково деловое требование использования файла Access, а не прямой записи в базу данных SQL? Там может быть более простое решение вашей проблемы.

0 голосов
/ 18 февраля 2020

Пожалуйста, попробуйте что-нибудь подобное, как показано на данных

SELECT DATEDIFF(day, '9990-12-31', TERM_DT) AS "DIFF"
,TERM_DT AS "DT"
FROM ...
JOIN ...
WHERE DATEDIFF(day, '2100-01-01', TERM_DT) <> 0
GROUP BY ...

Надеюсь, это поможет.

0 голосов
/ 18 февраля 2020

Почему бы просто не использовать что-то подобное?

where term_dt > '2100-01-01'

Я был бы удивлен, если бы у вас были реальные даты даже в таком далеком будущем.

Кроме того, у вас есть свои аргументы date_diff() в обратном направлении, поэтому число отрицательное.

...