Вычислите сколько дней между двумя датами в DB2? - PullRequest
10 голосов
/ 02 марта 2012

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

 SELECT DAYS (CURRENT DATE) - DAYS (DATE(CHDLM)) FROM CHCART00 WHERE CHSTAT = '05';

Я знаю, что если я удаляю CHDLM и указываю дату, например «2012-02-20», это работает, но мне нужно иметь возможность запуститьэто против этого поля в таблице.Я также пробую этот запрос, который мне дал друг, тоже не работает.

 select days (current date) - days (date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05';

Пожалуйста, любая помощь будет очень признательна.Спасибо

Ответы [ 5 ]

11 голосов
/ 03 марта 2012

Я думаю, что @Siva на правильном пути (используя DAYS()), но вложенные CONCAT() вызывают у меня головокружение.Вот мое мнение.
О, нет никакого смысла ссылаться на sysdummy1, так как вы должны извлекать данные из таблицы независимо.
Кроме того, не используйте синтаксис неявного соединения - это считается антипаттерном SQL.

Я бы обернул преобразование даты в CTE для удобства чтения, но ничто не мешает вам сделать это встроенным.

WITH Converted (convertedDate) as (SELECT DATE(SUBSTR(chdlm, 1, 4) || '-' ||
                                               SUBSTR(chdlm, 5, 2) || '-' ||    
                                               SUBSTR(chdlm, 7, 2))
                                   FROM Chcart00
                                   WHERE chstat = '05')

SELECT DAYS(CURRENT_DATE) - DAYS(convertedDate)
FROM Converted
3 голосов
/ 08 июля 2013

Я столкнулся с той же проблемой во встроенной базе данных Derby IBM DB2 в настольном приложении java, и после дня поиска я наконец нашел, как это делается:

SELECT days (table1.datecolomn) - days (current date) FROM table1 WHERE days (table1.datecolomn) - days (current date) > 5

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

0 голосов
/ 02 марта 2012

Кажется, что одна закрывающая скобка отсутствует в ,right(a2.chdlm,2)))) from sysibm.sysdummy1 a1,

Так что ваш запрос будет

select days(current date) - days(date(select concat(concat(concat(concat(left(a2.chdlm,4),'-'),substr(a2.chdlm,4,2)),'-'),right(a2.chdlm,2)))) from sysibm.sysdummy1 a1, chcart00 a2 where chstat = '05';
0 голосов
/ 02 марта 2012

Не будет ли это просто:

SELECT CURRENT_DATE - CHDLM FROM CHCART00 WHERE CHSTAT = '05';

Это должно возвращать количество дней между двумя датами, если я правильно понимаю, как арифметика дат работает в DB2.

Если CHDLM не дата, вам придется конвертировать ее в одну. Согласно IBM, функции DATE () было бы недостаточно для формата ггггммдд, но она работала бы, если бы вы могли отформатировать так: гггг-мм-дд.

0 голосов
/ 02 марта 2012
values timestampdiff (16, char( 
    timestamp(current timestamp + 1 year + 2 month - 3 day)- 
    timestamp(current timestamp)))
1
=
422



values timestampdiff (16, char( 
    timestamp('2012-03-08-00.00.00')- 
    timestamp('2011-12-08-00.00.00')))
1
=
90

---------- РЕДАКТИРОВАТЬ В Galador

SELECT TIMESTAMPDIFF(16, CHAR(CURRENT TIMESTAMP - TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD'))
FROM CHCART00
WHERE CHSTAT = '05'

EDIT

Как было указано X-Zero, эта функция возвращает только оценку. Это правда. Для получения точных результатов я использовал бы следующее, чтобы получить разницу в днях между двумя датами a и b:

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')))
FROM CHCART00 
WHERE CHSTAT = '05';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...