2012-03-02 4 views
7

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

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

+0

Похоже, есть проблема с вашим типом данных столбца ... – Teja

ответ

8

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

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

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 
+0

Спасибо, много X-Zero, это отлично работает. – jorame

+0

Извините, еще один вопрос, что делать, если мне нужно выбрать больше полей из таблицы CHCART00, как я могу это сделать? – jorame

+0

Ничего, я не понимаю. Спасибо – jorame

0
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 

---------- EDIT BY Galador

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

EDIT

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

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

Как я могу реализовать это по моему запросу? – jorame

+0

Я добавил в запрос, который, как мне кажется, должен получить то, что вы хотите (при условии, что 'CHDLM' является типом даты или времени, или правильно отформатированной строкой). – bhamby

+0

CHDLM отформатирован как yyyymmdd, как вы думаете, этот запрос будет работать с этим? – jorame

0

Похоже, один закрывающей скобкой не хватает на ,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

Не работает, я получаю «токен CONCAT» недействителен. Действительные токены: (, «ошибка – jorame

0

не было бы просто:

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

это должно г eturn количество дней между двумя датами, если я понимаю, как арифметика даты работает в DB2 правильно.

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

+0

Любая идея о том, как я могу отформатировать такую ​​дату? – jorame

+0

К сожалению, результаты этих операций - это _indefinite period_ (т. е. 2 месяца, 3 дня), даже если исходный формат действителен. OP специально запросил количество дней. –

+0

А, мои извинения, это должны быть ДНИ (CURRENT_DATE) - ДНИ (CHDLM) –

2

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

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

для получения дополнительной информации check this site

+1

Это будет работать только если даты всегда известны в том же месяце. ('day' просто возвращает поле« день месяца »). Использование' days' должно работать для общих случаев, так как оно возвращает число da с эпохи. –

Смежные вопросы