Случай когда с другим для каждого условия «Когда» - PullRequest
0 голосов
/ 26 августа 2018

У меня есть таблица, где разные форматы даты. Я пытаюсь написать ниже запрос, который имеет логику, как если бы отдел был A, и если дата равна 01-окт-2010, это ноль, иначе сохранить исходную дату с измененным форматом. Я выполняю это в Импале. Существуют различные форматы даты, такие как:

M/d/yyyy
MM/d/yyyy
dd-MM-yyyy

и т. Д.

Мой запрос выглядит следующим образом.

 select   
 CASE WHEN y.dept='MDM'  
    CASE  WHEN 
     a.date=from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy') 
     AND from_unixtime(unix_timestamp(a.date, 
    'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss') ='10-01-2010 00:00:00' THEN null
                 ELSE from_unixtime(unix_timestamp(a.date, 
'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss') 
 else
     WHEN a.date=from_unixtime(unix_timestamp(a.date, 
    'MM/dd/yyyy'),'MM/dd/yyyy')   
    AND from_unixtime(unix_timestamp(a.date, 'MM/dd/yyyy'),'yyyy-MM-dd 
   HH:mm:ss') ='10-01-2010 00:00:00' THEN null
   ELSE from_unixtime(unix_timestamp(a.date, 'MM/dd/yyyy'),'yyyy-MM-dd 
   HH:mm:ss') 
End 

Case WHEN a.date=from_unixtime(unix_timestamp(a.date, 
'M/dd/yyyy'),'M/dd/yyyy') 
AND from_unixtime(unix_timestamp(a.date, 'M/dd/yyyy'),'yyyy-MM-dd 
HH:mm:ss') ='10-01-2010 00:00:00' THEN null
ELSE from_unixtime(unix_timestamp(a.date, 'M/dd/yyyy'),'yyyy-MM-dd 
HH:mm:ss') End End

FROM Table INNER JOIN Table Y
ON y.id=a.id WHERE y.dept='MDM'

Я сравниваю формат даты A.date - если он совпадает

from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy')

и

from_unixtime(unix_timestamp(a.date, 'M/d/yyyy'),'yyyy-MM-dd HH:mm:ss') matches 1-Oct-2010 

тогда ноль, если нет, то оставьте исходную дату с измененным форматом на «гггг-мм-дд чч: мм: сс».

Беда в том, что моя инструкция Case выдает ошибку. Я могу выполнить все дела, когда с оператором Final Else правильно, но здесь мне нужно ELSE для каждого WHEN, поскольку мой формат даты отличается. Один ELSE в конце сделает большинство моих форматов дат нераспознанными и даст значение NULL. Любые входные данные для исправления этого утверждения будут полезны

1 Ответ

0 голосов
/ 26 августа 2018

Предполагая, что здесь применимо логическое вычисление ленивых / коротких замыканий и предполагая, что ошибка генерируется из функции from_unixtime(), вы можете сначала проверить, что результат unix_timestamp() действителен ПЕРЕД передачей этого результатав from_unixtime(), что позволит избежать ошибки.

Например CASE WHEN unix_timestamp(a.date,'M/d/yyyy') > 0 AND a.date=from_unixtime(unix_timestamp(a.date,'M/d/yyyy'),'M/d/yyyy') ...

...