Oracle SQL DB: если равен понедельнику, то выполнить определенный оператор - PullRequest
1 голос
/ 20 мая 2019

Я использую оператор SQL в Power BI в системе на базе Oracle, чтобы получить некоторые данные, когда день недели равен понедельнику.В идеале я пытаюсь сделать так, чтобы он работал в любом месте.Я пытаюсь преобразовать "C_endtime" в день недели и сравнить его с sysdate.В основном, если это понедельник, то я хочу, чтобы все данные из этой таблицы вернулись в пятницу, а через день - просто данные за предыдущий день.

Другими словами, я в конечном итоге снимаю:

...
where
if 
   sysdate = 1 (Monday) 
then 
   pull data back 3 days (sysdate -3) 
else 
   one day (sysdate -1) 

Вот моя попытка:

SELECT 
   Example Fields                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
FROM 
   Example Table
WHERE

TO_CHAR(c_endtime, 'D', 'NLS_DATE_LANGUAGE=ENGLISH')  >
   CASE TO_CHAR(sysdate, 'D', 'NLS_DATE_LANGUAGE=ENGLISH') 
      WHEN '1' then sysdate - 3
   ELSE
      sysdate - 1
   END 

AND 
   c_workcentrename = ####

Я получаю ошибку: "ORA-01840: значение ввода недостаточно для формата даты. "

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Результат TO_CHAR(c_endtime, 'D') зависит от текущей настройки NLS сеанса пользователя, то есть результат не предсказуем.

Лучшее условие использования:

IF TO_CHAR(c_endtime, 'fmDay', 'NLS_DATE_LANGUAGE = American') = 'Monday' THEN

или

TRUNC(c_endtime) = TRUNC(c_endtime, 'IW') THEN
1 голос
/ 20 мая 2019

Предполагая, что в понедельник вы хотите все с начала пятницы и в другие дни с начала предыдущего дня, вы можете использовать логику следующим образом:

select . . .
from . . .
where ( (trunc(sysdate) = trunc(sysdate, 'IW') and c_endtime >= trunc(sysdate - 3)) or
        (trunc(sysdate <> trunc(sysdate, 'IW') and c_endtime > trunc(sysdate - 1))
      ) and
      c_workcentrename = ###;

Недели ISO начинаются в понедельник иэто не меняется в ближайшее время или в любой среде.

Вы можете упростить вышеупомянутое до:

where ( (trunc(sysdate) = trunc(sysdate, 'IW') and c_endtime >= trunc(sysdate - 3)) or
        (c_endtime >= trunc(sysdate - 1))
      ) and
      c_workcentrename = ###;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...