Вычисление количества дней между двумя датами в 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';