Расчет даты не работает в Oracle SQL Case Statement?

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

1 неделя

Пятница, Суббота, Воскресенье, Понедельник, Вторник, Среда, Четверг

Лучшее, что я придумал для этого, - это оператор case, который устанавливает пятницу, субботу и воскресенье как первый день недели на следующей неделе (первый день системы - понедельник, а последний день - воскресенье).

SELECT TRANSACTIONDATE,
        CASE  
        WHEN TO_CHAR(TRANSACTIONDATE, 'DAY') IN ('FRIDAY', 'SATURDAY', 
'SUNDAY') THEN (TRUNC(TRANSACTIONDATE, 'IW')+7)
        ELSE TRUNC(TRANSACTIONDATE, 'IW')
        END AS TEST
FROM TRANSACTIONS

Моя логика для этого кода такова: если пт, сб или вс, то найдите первый день недели и добавьте 7, вернув первый день недели на следующей неделе.

Проблема в том, что выражение «TRUNC (TRANSACTIONDATE, 'IW') + 7» не добавляет 7 дней к началу недели.

Когда я спрашиваю

select "TRUNC(TRANSACTIONDATE, 'IW')+7" from transactions 

Я получаю начало недели на следующей неделе, и это правильно.

Таким образом, все дни с пятницы по четверг будут под одним и тем же номером недели.

Есть идеи, что происходит не так, или есть ли лучший способ добиться того, что мне нужно?

Спасибо, Том

Редактировать**

Первый набор данных - это то, чего я хотел бы достичь,

Date           Day       Week
4/1/2018       Monday    1
4/2/2018       Tuesday   1
4/3/2018       Wednesday 1
4/4/2018       Thursday  1
4/5/2018       Friday    2
4/6/2018       Saturday  2
4/7/2018       Sunday    2
4/8/2018       Monday    2
4/9/2018       Tuesday   2
4/10/2018      Wednesday 2
4/11/2018      Thursday  2

Итак, выше вы можете видеть, что я хочу, чтобы пятница / суббота / воскресенье выпала на следующую неделю.

Это текущие системные даты / недели,

Date        Day      Week
4/1/2018    Monday    1
4/2/2018    Tuesday   1
4/3/2018    Wednesday 1
4/4/2018    Thursday  1
4/5/2018    Friday    1
4/6/2018    Saturday  1
4/7/2018    Sunday    1
4/8/2018    Monday    2
4/9/2018    Tuesday   2

Случай выражение, а не инструкция.

jarlh 02.05.2018 11:53

Можете ли вы предоставить образцы данных и желаемые результаты? Я не уверен, что полностью понимаю «Я пытаюсь изменить начало недели набора данных с понедельника на предыдущую пятницу».

Gordon Linoff 02.05.2018 11:56

Да, я добавил это к вопросу.

TechCowboy 02.05.2018 12:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
360
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в TO_CHAR(TRANSACTIONDATE, 'DAY')

  • При использовании 'DAY' название дня недели дополняется пробелами. Попробуйте SELECT '<'||TO_CHAR(DATE '2018-05-07', 'DAY')||'>' from dual;, чтобы увидеть эффект.

  • Функция TO_CHAR(..., 'DAY') возвращает название дня недели в соответствии с настройками текущего сеанса пользователя NLS_DATE_LANGUAGE. Это может быть английский или нет.

Измените свое выражение, например, на

TO_CHAR(TRANSACTIONDATE, 'fmDAY', 'NLS_DATE_LANGUAGE=american') IN ('FRIDAY', 'SATURDAY', 'SUNDAY') 

Спасибо за Ваш ответ! Вы правы, поскольку SELECT '<' || TO_CHAR (DATE '2018-05-07', 'DAY') || '>' из двойного; возвращает <ПОНЕДЕЛЬНИК>

TechCowboy 02.05.2018 12:54

Другие вопросы по теме