Как преобразовать десятичную дату в поле даты в операторе where? - PullRequest
3 голосов
/ 26 октября 2011

У меня есть поле с десятичной датой (ГГГГММДД). Мне нужно найти все записи, которые старше года. Поскольку свидание так просто, я пытаюсь сделать:

WHERE DATE(SUBSTR(CHAR(A.CPADDT),1,4) CONCAT '-' CONCAT 
      SUBSTR(CHAR(A.CPADDT),5,2) CONCAT '-' CONCAT
      SUBSTR(CHAR(A.CPADDT),7,2)) > CURRENT_DATE - 1 YEAR

Это прекрасно работает в SELECT части. Когда я положил его в WHERE я получаю раздел «Ошибка выбора, связанная с полем * N.»

Есть идеи, что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

К счастью, ГГГГММДД заканчивается естественным порядком.Таким образом, вместо того, чтобы анализировать записи, почему бы не просто «отформатировать» дату года назад и сравнить ее с этим?

Неясно, откуда именно вы это называете, и можете ли вы предоставитьлогика есть, но если нет, и это внутри хранимой процедуры, вы всегда можете поместить логику туда.В основном вы хотите иметь что-то вроде (псевдокод):

CUTOFF = CURRENT_DATE - 1 YEAR
CUTOFF_NUMERIC = CUTOFF.YEAR * 10000 + CUTOFF.MONTH * 100 + CUTOFF.DAY
SELECT ... FROM A WHERE A.CPADDT > CUTOFF_NUMERIC

Извинения за невозможность дать вам фактический код - я не знаком с этим диалектом SQLи я в любом случае далеко не эксперт по SQL.Надеюсь, этого предложения хватит, чтобы вы пошли.Обратите внимание, что это также должно помочь с точки зрения производительности - если у вас есть индекс на CPADDT, тогда этот запрос может использовать его легко, тогда как ваша первоначальная попытка, вероятно, не сможет.Даже если у вас нет индекса, простое числовое сравнение, вероятно, будет дешевле, чем все это форматирование и анализ.

2 голосов
/ 26 октября 2011

Selection error involving field *N. означает, что в вашей таблице указана недопустимая дата.

Проверьте журнал заданий на CPD4019.Причина будет включать относительный номер записи неверной даты.

Message . . . . :   Select or omit error on field &10 member &1.            
Cause . . . . . :   A select or omit error occurred in record &5, record    
  format &7, member number &8 of file &2 in library &3, because of condition
  &6 of the following conditions:                                           

Вы также можете использовать решение Джона Скита, встроенное, например,

WHERE A.CPADDT > YEAR(CURRENT_DATE - 1 YEAR) * 10000                
+ MONTH(CURRENT_DATE - 1 YEAR) * 100 + DAY(CURRENT_DATE - 1 YEAR)

, и вам вообще не придется беспокоиться об ошибках преобразования даты вдополнение к другим преимуществам.

0 голосов
/ 26 октября 2011

Оба предыдущих ответа были хорошими. На самом деле я был плохим программистом и не был на 100% уверен, что данные верны. Было несколько «нулевых дат», где их не должно быть. После того, как я удалил их из запроса, он работает.

A.CPADDT <> 0 AND DATE(SUBSTR(DIGITS(A.CPADDT),1,4) CONCAT '-' CONCAT   
    SUBSTR(DIGITS(A.CPADDT),5,2) CONCAT '-' CONCAT        
    SUBSTR(DIGITS(A.CPADDT),7,2)) > CURRENT_DATE - 1 YEAR 

В данном конкретном случае мы включаем данные для самостоятельного поиска только в том случае, если человек хочет увидеть статус своего платежа. Я, вероятно, не закончил с этим, поскольку я уверен, что нет никакой проверки даты при вводе пользователем (программе, вероятно, более 15 лет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...