Oracle - Как получить дату от ГОДА, НЕДЕЛИ и НЕДЕЛИ? - PullRequest
2 голосов
/ 28 мая 2019

Мне нужно найти дату конкретного года, недели и дня недели в оракуле.Есть ли встроенная функция для этого в Oracle?или как мне этого добиться?

Пример: если год = 2019, неделя = 22, день = 2 (вторник), то дата должна быть '28 -05-2019 '.

Ответы [ 3 ]

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

Предполагая, что "Неделя" и "Год" означают неделю и год в соответствии с ISO-8601 , вы можете использовать эту функцию:

CREATE OR REPLACE FUNCTION ISOWeekDate(YEAR INTEGER, WEEK INTEGER, DAY INTEGER) RETURN DATE DETERMINISTIC IS
    res DATE;
BEGIN
    IF WEEK > 53 OR WEEK < 1 THEN
        RAISE VALUE_ERROR;      
    END IF;

    res := NEXT_DAY(TO_DATE( YEAR || '0104', 'YYYYMMDD' ) - INTERVAL '7' DAY, 'MONDAY') + ( WEEK - 1 ) * 7;

    IF TO_CHAR(res, 'fmIYYY') = YEAR THEN
        RETURN res + DAY - 1;
    ELSE
        RAISE VALUE_ERROR;
    END IF;
END ISOWeekDate;
1 голос
/ 28 мая 2019

Я думаю, что для этого нет встроенной функции, вам придется создать ее самостоятельно. ниже приведено одно из решений, которое вы можете использовать.

WITH FUNCTION getDate(p_year IN NUMBER, p_weeks IN NUMBER, p_day in NUMBER) RETURN DATE
IS
  v_tmp date;
  v_day number;
BEGIN
  v_tmp := to_date('01/01/'||to_char(p_year),'dd/mm/yyyy'); 
  v_day := to_char(v_tmp,'D');

  RETURN v_tmp+(p_weeks-1)*7+p_day-(v_day)+1;
END;
SELECT getDate(2019,22,2)
FROM DUAL;
/

Согласно моим настройкам NLS_TERRITORY, Oracle нумерует день недели, начиная с воскресенья, но из вашего примера вы, похоже, рассматриваете понедельник как 1-й день недели. Таким образом, такая же настройка была сделана для функции, чтобы вернуть ожидаемый результат.

Также обратите внимание, что с помощью функции предложения это новая функция Oracle 12c, если вам случится использовать более старую версию Oracle, вам придется создать хранимую функцию перед ее вызовом.

0 голосов
/ 28 мая 2019

Логически, номер недели ISO - это четверг в этом (григорианском) календарном году.Год ISO недели ISO - это григорианский год, в который попадает четверг этой недели ISO.

В схеме ISO недели всегда содержат 7 дней.Недели начинаются в понедельник, заканчиваются в воскресенье, и дни этой недели пронумерованы 1-7.

Эта схема нумерации в будние дни часто отличается от той, которая возвращается из встроенных WEEKDAY функций и аналогична в различных пакетах программного обеспечения (или требует определенных настроек базы данных), о чем следует знать.Вам понадобится функция, которая возвращает день недели определенной даты в соответствии со схемой нумерации ISO.

Первый четверг года может происходить в любом месте в диапазоне с 01 января по 07 января.

Если первый четверг выпадает на 01 января, то первая неделя ISO этого года будет включать дни (29/31 декабря) по сравнению с предыдущим григорианским годом.

Если первый четверг выпадает на 7 января, то последняя неделя ISO предыдущего григорианского года будет включать дни (01/03 января) текущего григорианского года.

Еслипервый четверг приходится на 4 января, затем косвенно первая неделя года начинается с понедельника 01 января.

Чтобы разработать алгоритм, проще всего определить, какой день недели 04 января.попадает в данный год, затем примените следующий расчет 4 - weekday.Если будет установлено, что день недели с 04 января - четверг, результат будет 0. Если это понедельник, результат будет 3 (4-1).Если это воскресенье, результат будет -3 (4-7).Мы сохраним это смещение для использования после следующего шага.

Мы можем получить предварительное смещение дня года из чисел недели и дня ISO следующим образом: (((iso_week - 1) * 7) - (4 - iso_day)).

Затем мы применяем смещение, полученное на первом этапе, к окончательному смещению дня года.Это смещение от 04 января данного григорианского года.Это смещение может быть минусом, если соответствующий день выпадает до 04 января данного года.

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

Например, дано 2019-W01-1.

2019-01-04 - пятница, поэтому день недели равен 5. Результат первого шага - -1 (4-5).Результат второго шага -3 (((1-1) * 7) - (4-1)).Вместе взятые, они дают смещение дня года в -4.04 января 2019 года компенсируется на -4, 31 декабря 2018 года.

И вот наш результат: 2019-W01-1 = 2018-12-31.

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