Поместите преобразование даты в пункт db2 sql - PullRequest
0 голосов
/ 10 февраля 2020

У меня следующий запрос. И я рассчитываю на столбец MYDATE, который является типом данных DECIMAL(8, 0), который хранит дату в виде цифры c в формате ГГГГММДД, как этот 20191107.

SELECT DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0) FROM PDF_TABLE;

Он работает нормально. Однако, когда я использую указанное выше преобразование в предложении WHERE, как показано ниже, запрос ничего не возвращает.

SELECT * FROM PDF_TABLE WHERE MYDATE = DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0);

Пример

enter image description here

Выше приведены данные как есть. Теперь я передаю дату 20200601 в качестве параметра в предложении WHERE следующего запроса, она должна вернуть следующую строку после вычитания 3 месяцев из 20200601.

enter image description here

SELECT * FROM PDF_TABLE WHERE MYDATE = DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS, 'yyyymmdd')), 8, 0);

Ответы [ 2 ]

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

Как это могло бы что-нибудь вернуть?

WHERE MYDATE = DECIMAL((TO_CHAR(TO_DATE(CAST(CAST(MYDATE AS INT) AS VARCHAR(8)), 'yyyymmdd') - 3 MONTHS

Отбрасывая преобразования, вы спрашиваете WHERE MYDATE = MYDATE - 3 months

Это никогда не будет равным .. Возможно, вы забыли изменить внутренний MYDATE на CURRENT_DATE или что-то еще? Это также потребует преобразования для изменения ..

Лично я использую пользовательскую функцию для этого типа преобразования; либо напишите это самостоятельно, либо загрузите бесплатный iDate Alan Campin's source

WHERE MYDATE = ConvertToIDate(CCURRENT_DATE - 3 months, '*CCYMD');

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

Попробуйте как есть:

WITH MYTAB (PDF_VOLUME, MYDATE) AS
(
VALUES
  ('110 GB', DEC(20200101, 8))
, ('120 GB', DEC(20200301, 8))
, ('390 GB', DEC(20200601, 8))
)
SELECT * 
FROM MYTAB
WHERE MYDATE = DEC(TO_CHAR(TO_DATE(CHAR(CAST(? AS DEC(8))), 'YYYYMMDD') - 3 MONTH, 'YYYYMMDD'), 8);
...