as400 дата запроса - PullRequest
       26

as400 дата запроса

0 голосов
/ 21 мая 2011

Чтобы запросить последние 7 дней с сегодняшнего дня в as400, поскольку он хранит даты в типе char, как получить результаты за сегодня, как я пытался использовать, например,

        where chardate >= char(days(curdate()) + 7)

но он все еще не работает

Ответы [ 2 ]

4 голосов
/ 21 мая 2011

Ответ состоит из двух частей. Первый связан с датой математики в этом конкретном варианте DB2. Выражение DB2, эквивалентное curdate()) + 7, равно current date + 7 days.

Второе включает преобразование значений даты в значения символов (или наоборот), чтобы мы могли их сравнить. Нам нужно знать, в каком формате chardate хранятся даты, прежде чем мы сможем их реально взломать. Давайте предположим, что это в формате YYYY-MM-DD. Затем вы можете использовать char(current date + 7 days, iso), чтобы получить в будущем семь дней в том же формате.

Итак, с этим допущением ваше утверждение where будет

where chardate >= char(current date + 7 days, iso)

Существует несколько стандартных форматов даты, которые date может преобразовать в:

  • ISO: YYYY-MM-DD
  • США: MM/DD/YYYY
  • EUR: DD.MM.YYYY
  • JIS: YYYY-MM-DD

Если ваш chardate находится в другом формате, вам нужно будет выполнить довольно сложную работу с substr. Например, для преобразования YYYY-MM-DD в YYYYMMDD вам потребуется что-то вроде

substr(char(current date, iso), 1, 4) ||
substr(char(current date, iso), 5, 2) ||
substr(char(current date, iso), 7, 2)

Основная проблема этого метода заключается в том, что форматы, которые не хранятся в порядке «год-месяц-день», не могут быть надежно сопоставлены. Таким образом, 12311969 (т.е. MMDDYYYY) будет сравниваться как больше, чем 01012011, поскольку в отношении базы данных вы сравниваете два восьмизначных числа. (Вот почему вы почти всегда должны хранить даты в реальных date полях или в YYYYMMDD или аналогичном правильно упорядоченном формате.)

Я добился большого успеха, используя бесплатную утилиту idate , которая предоставляет пользовательские функции SQL (UDF) для преобразования дат, хранящихся в символьных и числовых полях, в даты. Обратите внимание, что это решение требует наличия компилятора RPG.

2 голосов
/ 23 мая 2011

За последние 7 дней с сегодняшнего дня:

where 
date(substr(chardate,1,4) || '-' || 
substr(chardate,5,2) || '-' || 
substr(chardate,7,2)) between current date - 7 days and current date

Чтобы выполнить сравнение диапазона символов:

where
chardate between 
substr(char(current date - 7 days, iso),1,4) ||
substr(char(curernt date - 7 days, iso),6,2) ||
substr(char(current date - 7 days, iso),9,2)
and 
substr(char(current date, iso),1,4) ||
substr(char(current date, iso),6,2) ||
substr(char(current date, iso),9,2) 
...