Oracle sql Получить пользователей со значением в поле MONDAY, ЕСЛИ СЕГОДНЯ понедельник - PullRequest
0 голосов
/ 16 мая 2018

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

Например, получить из моей таблицы всех пользователей, чье поле 'Monday' не равно NULL, ЕСЛИ СЕГОДНЯ понедельник.

Он будет работать каждый день, поэтому ему нужно оценить, какой день недели это каждый день, и получить соответствующих пользователей на этот день.

Я нашел этот фрагмент кода, чтобы получить день недели, но я не уверен, как использовать его в другом операторе выбора:

select to_char(sysdate,'D') from dual

Любая помощь будет оценена!

Отредактировано для добавления образца данных и вывода:

USER | 123456
SUNDAY | 
MONDAY | 18
TUESDAY | 
WEDNESDAY | 15
THURSDAY | 
FRIDAY | 
SATURDAY | 11   
 ---
USER | 789023
SUNDAY | 18
MONDAY | 
TUESDAY | 3
WEDNESDAY | 15
THURSDAY | 
FRIDAY | 
SATURDAY | 11

Итак, в понедельник вывод будет:

  USER | 123456         

Во вторник вывод будет:

 USER | 789023  

Ответы [ 5 ]

0 голосов
/ 16 мая 2018

Если вы предпочитаете придерживаться имен дней, а не вычисленного смещения, вы можете использовать необязательный третий аргумент для функции to_char() , чтобы избежать сессий NLS @MTO указал:

to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH'

даст вам полное название дня на английском языке. (Обратите внимание, что вы не можете использовать это, чтобы получить специфичную для запроса интерпретацию элемента D; также FM удаляет обычные правые отступы, чтобы сделать все имена одинаковой длины; здесь это не имеет значения. ..)

Как демонстрация с вашими данными в CTE и именами столбцов, которые будут действительными:

with your_table (user_id, sunday, monday, tuesday, wednesday, thursday, friday, saturday)
as (
            select 123456, null, 18, null, 15, null, null, 11 from dual
  union all select 789023, 18, null, 3, 15, null, null, 11 from dual
)
select user_id
from your_table
where case to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH')
    when 'SUNDAY' then sunday
    when 'MONDAY' then monday
    when 'TUESDAY' then tuesday
    when 'WEDNESDAY' then wednesday
    when 'THURSDAY' then thursday
    when 'FRIDAY' then friday
    when 'SATURDAY' then saturday
  end is not null;

   USER_ID
----------
    123456
    789023

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

0 голосов
/ 16 мая 2018

Вы можете использовать TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ), чтобы получить день недели в виде числа (0 = понедельник, 6 = воскресенье), и это не зависит от параметров сеанса NLS

Использование:

  • TO_CHAR( datavalue, 'D' ) даст разные первые дни недели на разных территориях;и
  • TO_CHAR( datevalue, 'DAY' ) будет давать разные значения на разных языках;
  • Но использование TRUNC( datevalue, 'IW' ) не зависит от всех этих проблем).

SQLСкрипка

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name (
  "USER"    INT,
  SUNDAY    INT,
  MONDAY    INT,
  TUESDAY   INT,
  WEDNESDAY INT,
  THURSDAY  INT,
  FRIDAY    INT,
  SATURDAY  INT
);

INSERT INTO table_name
SELECT 123456, NULL, 18, NULL, 15, NULL, NULL, 11 FROM DUAL UNION ALL
SELECT 789023, 18, NULL, 3, 15, NULL, NULL, 11 FROM DUAL;

Запрос 1 :

SELECT *
FROM   (
  SELECT "USER",
         CASE TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' )
         WHEN 0 THEN MONDAY
         WHEN 1 THEN TUESDAY
         WHEN 2 THEN WEDNESDAY
         WHEN 3 THEN THURSDAY
         WHEN 4 THEN FRIDAY
         WHEN 5 THEN SATURDAY
         WHEN 6 THEN SUNDAY
         END AS value
  FROM   table_name
)
WHERE  value IS NOT NULL

Результаты :

|   USER | VALUE |
|--------|-------|
| 123456 |    15 |
| 789023 |    15 |
0 голосов
/ 16 мая 2018

Используя Connect By level, вы можете получить дни недели с соответствующими числами:

select to_char(sysdate+level,'D','NLS_DATE_LANGUAGE=Turkish') "Day No", 
       to_char(sysdate+level,'Day','NLS_DATE_LANGUAGE=Turkish') "Day(Of Week)"
  from dual 
connect by level <= 7 
order by 1;

Также может быть создано представление для использования таких значений, как таблица, как ( NLS_DATE_LANGUAGE)параметр может быть связан с вашими локальными настройками ):

create view v_days as
select to_char(sysdate+ level,'D','NLS_DATE_LANGUAGE=Turkish') day_no , 
       to_char(sysdate+ level,'Day','NLS_DATE_LANGUAGE=Turkish') day
  from dual 
connect by level <= 7 
order by 1;
0 голосов
/ 16 мая 2018

Вы можете использовать это:

Предположим, что у вашей таблицы есть имя из 7 столбцов sunday, monday, ...

SELECT user_column --user_id
FROM table_name
WHERE (
        TO_CHAR(sysdate, 'D') = 1 AND sunday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 2 AND monday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 3 AND tuesday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 4 AND wednesday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 5 AND thursday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 6 AND friday IS NOT NULL
        OR TO_CHAR(sysdate, 'D') = 7 AND saturday IS NOT NULL
    );
0 голосов
/ 16 мая 2018

Этот запрос возвращает сокращенный день (вс - сб):

select to_char(sysdate,'DY') from dual;

Проще проверить.

Вы можете написать запрос, который возвращает правильный столбец, например:

select case to_char(sysdate,'DY') 
    when 'MON' then monday
    when 'TUE' then tuesday
    when 'WED' then wednesday
    when 'THU' then thursday
    when 'FRI' then friday
    when 'SAT' then saturday
    when 'SUN' then sunday
    else NULL
end 
from yourtable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...