Как исправить этот код?Я пытаюсь получить функцию даты на основе случаев - PullRequest
0 голосов
/ 08 апреля 2019

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

Я попробовал следующий код, просто краткое изложение аспекта даты, но он продолжает показывать мне эту ошибку

ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:
Error at Line: 3 Column: 2

Код выглядит следующим образом:

Select
A11.Fact_Date Fact_Date,
From XX.X_XX_XX_XX a11
where (A11.Fact_Date = 
Case   
When To_Char(SYSDATE, 'd') = 7 Then A11.Fact_Date = (CURRENT_DATE - 2)   
When To_Char(SYSDATE, 'd') = 1 Then A11.Fact_Date = (CURRENT_DATE - 3)
Else A11.Fact_Date = (CURRENT_DATE - 1)
End);

Это может показаться глупым вопросом, но я был бы очень признателен за любую помощь, поскольку я новичок в использовании SQL.

1 Ответ

1 голос
/ 08 апреля 2019

Как и случайная запятая, которая была указана в комментарии, смешивание sysdate и current_date выглядит странно и может вызвать странные проблемы (поскольку они могут представлять разные дни);и оба содержат время, поэтому вы, вероятно, захотите сравнить значение таблицы с trunc(case ... end) - и вы не будете повторять этот столбец в предложении:

select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(
  case
    when to_char(sysdate, 'd') = '1' then sysdate - 3
    when to_char(sysdate, 'd') = '7' then sysdate - 2
    else sysdate - 1
  end);

или, возможно, с простым выражением регистра вместоискали один (также обрабатывая значение d как число):

select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
  - case to_number(to_char(sysdate, 'd'))
      when 1 then 3
      when 7 then 2
      else 1
    end;

Однако значение строки / числа d day зависит от настроек NLS, поэтому может быть безопаснее - и, возможно,яснее - использовать названия дней (принудительно переведенные на определенный язык, чтобы избежать дальнейших проблем с NLS):

select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
  - case to_char(sysdate, 'FMDay', 'NLS_DATE_LANGUAGE=ENGLISH')
      when 'Monday' then 3
      when 'Sunday' then 2
      else 1
    end;

db <> fiddle , показывающий все три запроса на двух территориях;обратите внимание на разные результаты для первых двух запросов, а также то, что третий является одинаковым независимо от настроек NLS.

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