Вычисление количества дней между двумя датами в DB2?

мне нужно получить разницу в днях между двумя датами в 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 ответов


Я думаю, что @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

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

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

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


Кажется, что одна закрывающая скобка отсутствует в ,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';

не было бы:

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

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

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


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'

редактировать

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

SELECT days (current date) - days (date(TIMESTAMP_FORMAT(CHDLM, 'YYYYMMDD')))
FROM CHCART00 
WHERE CHSTAT = '05';