oracle первый день недели

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

Таким образом, в основном мне нужно иметь возможность извлечь дату понедельника (15.01.18) и дату пятницы (19.01.18) недели 1/16/18, а затем объединить их с помощью тире (-) между. Мне нужно сделать это для каждого ряда.

3 ответа

Чтобы отформатировать дату в виде строки в нужном формате, вы можете использовать to_char ; например:

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

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

В этом случае понедельник и пятница всегда будут с одной и той же недели, но если SYSDATE в выходные, возвращенный понедельник и пятница будут с ПРЕДЫДУЩЕЙ недели.

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

Источник

Первый день недели стр. 2

@@DATEFIRST возвращает число, которое определяет первый день недели, установленный для текущей сессии. При этом 1 соответствует понедельнику, а 7, соответственно, воскресенью. Т.е. если

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

dayweek_day
2013-01-07Monday

Чтобы изменить значение первого дня недели (на время текущей сессию), можно использовать оператор SET DATEFIRST. Так, если выполнить следующий код

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

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

Языковые настройки влияют, в частности, на символьное представление компонентов даты/времени. Сравните, например, результаты:

day_of_weekmonth
MondayDecember

day_of_weekmonth
понедельникДекабрь

day_of_weekmonth
MontagDezember

Решить эту задачу (Определить дату, на которую выпал первый понедельник января 2013 года.) можно и без применения функции @@DATEFIRST, воспользовавшись методом, предложенным Ициком Бен-Ганом [8]. Идея решения заключается в том, что:

1. Первое января 1900г. было понедельником.

2. Количество дней между двумя одинаковыми днями недели всегда кратно семи.

Тогда первоначальный запрос из этой главы выглядел бы так:

Источник

Oracle первый день недели

Функция SYSDATE
Функция SYSDATE возвращает текущую дату и время по часам сервера.

Пример:
SELECT SYSDATE FROM dual;

Функция ADD_MONTHS (d, x)
Возвращает дату, полученную в результате прибавления к дате d одного или нескольких месяцев. Количество месяцев задается параметров x, причем x может быть отрицательным — в этом случае указанное количество месяцев вычитается из заданной даты.

Функция LAST_DAY (d)
Возвращает последнее число месяца, указанного в дате d.

Пример:
SELECT SYSDATE d, LAST_DAY ( SYSDATE ) d1 FROM dual;

Функция MONTHS_BETWEEN (d1, d2)
Функция MONTHS_BETWEEN возвращает количество месяцев между двумя датами d1 и d2 с учетом знака как d1-d2, возвращаемое число является дробным.

Функция TRUNC (d[,mask])
Производит усечение указанной даты в соответствии с маской. Если маска не указана, то усечение производится до даты (время отбрасывается).

Пример:
SELECT SYSDATE d1, TRUNC ( SYSDATE ) d2 FROM dual;

Усечение даты до часов, дней, месяца и года. Форматная маска по умолчанию равна «DD»

Функция TO_DATE (str[,mask [,nls_lang]])
Функция TO_DATE преобразует строку str в дату. Преобразование ведется по маске mask, если она указана. Если маска не указана, то берется маска по умолчанию. В случае указания маски можно указать еще один параметр — язык, используемый при форматировании названий месяцев и дней. В случае ошибки анализа строки str в соответствии с заданной маской возникает исключительная ситуация. Наиболее распространенная ошибка «ORA-01830: шаблон формата даты завершается перед преобразованием всей строки ввода». Кроме того, нередко встречается ошибка «ORA-01821: формат даты не распознан» — она возникает при указании недопустимой форматной маски.

Пример:
SELECT TO_DATE ( ‘12.09.2006’ ) d FROM dual;

Функция TO_CHAR (d[,mask])
Преобразует дату d в символьную строку в соответствии с заданной маской. В случае указания недопустимой маски возникает исключительная ситуация «ORA-01821: формат даты не распознан».

Форматные маски функции TO_CHAR :

Источник

Мой блог

среда, 2 июля 2014 г.

Дата и время в Oracle

Форматы даты по умолчанию:

select sysdate from dual;

При вставке в таблицу значений типа date, по умолчанию можно использовать литерал в формате

DD-MON-YYYY
(две цифры номера дня, три буквы месяца и четыре цифры года)

insert into t1 (d) values (’28-APR-1971′);

или использовать ключевое слово DATE для передачи в базу литерала типа data в формате ANSI

YYYY-MM-DD
(четыре цифры года, две цифры месяца, две цифры номера дня)

insert into t1 (d) values ( DATE ‘1971-04-28’);

Конвертация даты в строку:

select to_char(sysdate) from dual;

02 ИЮЛЬ 2014 17:00:51

select to_char(sysdate, ‘CC‘) from dual; — двузначное столетие (век)

Немного о стандарте ISO.

В стандарте ISO, год, относящийся к номеру недели ISO, может отличаться от календарного года.

1 января 1988 года попадает на 53-ю неделю ISO для 1987 года.
Неделя всегда начинается с понедельника и заканчивается воскресеньем.

Как связан год с номером недели по стандарту ISO:

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

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

1 января 1991 падает на вторник, поэтому неделя с понедельника, 31 декабря 1990 по воскресенье, 6 января 1991 считается неделей 1.

Чтобы получить номер недели ISO, используйте маску формата ‘IW‘ для номера недели и одну из масок вида ‘IY‘ для года.

в данном случае результаты совпадают.

Попробуем с другой датой:

Как видим результаты разные.

При вставке в таблицу даты, рекомендуется указывать все четыре цифры года.
Если указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет интерпретировать в зависимости от того, какой формат был использован при вводе.
Если использовать формат YY, то в качестве столетия будет использовано текущее столетие,
которое в настоящее время установлено на сервере.

select
to_char(to_date(’28-04-14′, ‘DD-MM-YY‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-YY‘), ‘DD-MM-YYYY’)
from dual;

Неважно какой год мы указали, столетие всегда будет текущее (т.е. 20)

Если использовать формат YYYY но при этом указать только две последние цифры года
то в качестве столетия Oracle подставит нули (т.е. 00)

select
to_char(to_date(’28-04-14′, ‘DD-MM-YYYY‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-YYYY‘), ‘DD-MM-YYYY’)
from dual;

Если использовать формат RR и указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет вычислять по следующим правилам:

Если указанный год находится в интервале от 00 до 49 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 50 до 99,
то столетие при этом будет увеличено на 1 (текущее столетие + 1).

select
to_char(to_date(’28-04-14′, ‘DD-MM-RR’), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-RR‘), ‘DD-MM-YYYY’)
from dual;

Вобщем запомнить легко, если указанный год, больше текущего диапазона, значит столетие уменьшаем
и наоборот если указанный год, меньше текущего диапазона, значит столетие увеличиваем.

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

select
to_char(to_date(’28-04-14′, ‘DD-MM-RRRR‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-RRRR‘), ‘DD-MM-YYYY’)
from dual;

В качестве столетия Oracle не подставил нули, вывод аналогичен формату RR.

Для выделения первой цифры столетия в формате года можно использовать запятую:

Допустимые форматы года:

2014 2014 2014 2014 2 014 014 014 14 14 14 4 4

А также год прописью:

Существует тип TIMESTAMP, который может хранить дробную часть секунд.
Необязательную точность представления секунд можно определить параметром FF[1..9]
Значение этого параметра по умолчанию равно 6 (справа от десятичной точки секунд можно поместить до 6 цифр)
При попытке поместить большее количество цифр в дробную часть секунд, значение дробной части будет округлено.

В отчетах statspack применяются следующие обозначения долей секунд:

SELECT TO_CHAR(SYSDATE, ‘YYYYMMDD HH24:MI.SS’) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘YYYY/MM/DD;HH24 «часов» MI «минут» SS «секунд»‘) FROM dual;

12-часовой формат исчисления времени предполагает разбиение 24 часов, составляющих сутки,
на два 12-часовых интервала, обозначаемых a.m. (лат. ante meridiem дословно — «до полудня»)
и p.m. (лат. post meridiem дословно — «после полудня»).

00:00 (полночь) 12:00 a.m.* (полночь)
12:00 (полдень) 12:00 p.m.* (полдень)

Проблемы в обозначениях полудня и полуночи:

Несмотря на наличие международного стандарта ISO 8601, 12 часов ночи и 12 часов дня обозначается в разных
странах по-разному. Это связано с тем, что в латинских словосочетаниях лат. ante meridiem и
лат. post meridiem слово meridiem означает буквально «середина дня» или «полдень»,
и нет однозначности между обозначением полудня как «12 a.m.» («12 ante meridiem»,
или «12 часов до середины дня») или как «12 p.m.» («12 post meridiem», или «12 часов после середины дня»).

С другой стороны, полночь также можно логично назвать «12 p.m.» (12 post meridiem,
12 часов после предыдущей середины дня) или «12 a.m.» (12 ante meridiem, 12 часов до следующей середины дня).

National Maritime Museum в Гринвиче рекомендует обозначать эти временные моменты как «12 дня» и «12 ночи».
То же советует и The American Heritage Dictionary of the English Language. Многие руководства по стилю,
принятые в США, предлагают «полночь» заменять на «11:59 p.m.», если мы хотим обозначить конец дня,
и «12:01 a.m.», если мы хотим обозначить начало следующего дня.

SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI.SS AM‘) FROM dual;

2014-10-18 14:53.58 PM

SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI.SS BC‘) FROM dual;

2014-10-18 15:00.25 Н.З.

SELECT TO_CHAR(SYSDATE, ‘DDTH‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘ddTH‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘mmTH‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘YYYYTH‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘yyyyTH-MMTH-DDTH HH24TH:miTH.SSTH BC’) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘DDSP‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘ddSP‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘mmTHSP‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘mmSP‘) FROM dual;

SELECT TO_CHAR(SYSDATE, ‘YYYYTHSP‘) FROM dual;

TWO THOUSAND FOURTEENTH

SELECT TO_CHAR(SYSDATE, ‘YYYYSP‘) FROM dual;

TWO THOUSAND FOURTEEN

Получить названия часовых поясов можно так:

select * from v$timezone_names;

Africa/Abidjan LMT
Africa/Abidjan GMT
Africa/Accra LMT
Africa/Accra GMT
Africa/Accra GHST
Africa/Addis_Ababa LMT
Africa/Addis_Ababa ADMT
Africa/Addis_Ababa EAT
Africa/Algiers LMT
Africa/Algiers PMT
Africa/Algiers WET
.

Посмотрим какое смещение относительно UTC установлено в нашей БД:

select dbtimezone from dual;

(меняется параметром time_zone в spfile.ora)

Часовой пояс сеанса можно определить так:

select sessiontimezone from dual;
Europe/Moscow

Его легко можно поменять на время сеанса:

alter session set time_zone = ‘PST’;
select sessiontimezone from dual;

Стандартное Тихоокеанское время PST отстает от UTC на восемь часов.
Восточное стандартное время EST отстает от UTC на пять часов.

Текущую дату для сеанса в локальном часовом поясе можно определить так:

select current_date from dual;

select to_char(current_date, ‘YYYY-MM-DD HH24:MI.SS’ ) from dual;

Для любого часового пояса можно найти величину смещения с помощью функции tz_offset().

select tz_offset(‘PST’) from dual;

select tz_offset(‘Europe/Moscow’) from dual;

Tип TIMESTAMP, в отличие от типа DATE, может хранить информацию о часовых поясах.

select to_char(SYSTIMESTAMP, ‘TZH:TZM‘) from dual;

select to_char(SYSTIMESTAMP, ‘TZR‘) from dual;

select to_char(SYSTIMESTAMP, ‘TZD‘) from dual;

select to_char(SYSTIMESTAMP, ‘HH:MI:SS.FFTZH:TZM‘) from dual;

select to_char(SYSTIMESTAMP, ‘YYYY-MM-DD HH:MI:SS TZH:TZM‘) from dual;

2014-10-18 10:52:19 +04:00

select to_char(SYSTIMESTAMP, ‘YYYY-MM-DD HH:MI:SS.FF AM TZH:TZM TZR TZD‘) from dual;

2014-10-18 10:52:31.802000 PM +04:00 +04:00

Чтобы конвертировать дату-время из одного часового пояса к другому,
можно воспользоваться функцией NEW_TIME().

Конвертация строки в тип дата-время.

Функцию TO_DATE(x [, формат])
можно использовать для конвертирования строки x в тип дата-время.

Если строка формата опущена, то дата должна быть представлена в формате по умолчанию:

DD-MON-YYYY или DD-MON-YY

(Вообще формат даты по умолчанию определяет параметр БД NLS_DATE_FORMAT)

alter session set NLS_DATE_LANGUAGE = ‘AMERICAN’ ;
alter session set NLS_DATE_FORMAT = ‘SYYYY-MM-DD’ ;
alter session set NLS_TIMESTAMP_FORMAT = ‘SYYYY-MM-DD HH24:MI:SS’ ;
alter session set NLS_TIMESTAMP_TZ_FORMAT = ‘SYYYY-MM-DD HH24:MI:SS TZH:TZM’ ;

alter session set NLS_DATE_LANGUAGE = ‘AMERICAN’;
alter session set NLS_DATE_FORMAT = ‘DD-MON-RRRR’;
select to_date(’28-APR-1971′), to_date(’28-APR-71′) from dual;

Можно и явно задать формат

Совместное использование to_date() и to_char()

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

alter session set NLS_DATE_FORMAT = ‘DD-MON-YYYY‘;

insert into t1 ( id, bday ) values (1, ‘28-APR-1971‘ );

National language_support (До Oracle9i)
Globalisation support (Начиная с Oracle9i)

Кодировка устанавливается только в переменных окружения!

1) Язык вывода сообщений об ошибках
2) на каком языке выводить названия месяцев и дней недели
(Если явно не задан параметр NLS_DATE_LANGUAGE)

SELECT * FROM v$nls_valid_values
WHERE parameter = ‘LANGUAGE’
ORDER BY value

SELECT * FROM v$nls_valid_values
WHERE parameter = ‘TERRITORY’
ORDER BY value

SELECT * FROM v$nls_valid_values
WHERE parameter = ‘CHARACTERSET’
— Русский язык, Кириллица
AND (value LIKE ‘CL%’
OR
value LIKE ‘RU%’)
ORDER BY value

NLS_LANG = AMERICAN_CIS.CL8MSWIN1251
NLS_LANG = AMERICAN_AMERICA.RU8PC866
NLS_LANG = RUSSIAN_CIS.CL8ISO8859P1

Какие есть параметры NLS?

SELECT * FROM nls_session_parameters

Как можно устанавливать значения параметров NLS?

1. В системном реестре Windows

2. Установить переменные окружения
Для Windows (в bat-файле)

3. ALTER SESSION SET
NLS_DATE_LANGUAGE=RUSSIAN
NLS_DATE_FORMAT=’DD.MM.YYYY’;

SELECT TO_CHAR(SYSDATE, ‘Month day’)
FROM dual

Посмотреть nls-параметры сессии, базы данных и инстанса можно так:

select * from
(select ‘SESSION’ SCOPE,s.* from nls_session_parameters s
union
select ‘DATABASE’ SCOPE,d.* from nls_database_parameters d
union
select ‘INSTANCE’ SCOPE,i.* from nls_instance_parameters i
) a
pivot (LISTAGG(VALUE) WITHIN GROUP (ORDER BY SCOPE)
FOR SCOPE
in (‘SESSION’ as «SESSION»,’DATABASE’ as «DATABASE»,’INSTANCE’ as «INSTANCE»));

Функции для работы с типом data.

ADD_MONTHS(data, n)
Позволяет добавить к дате целое количество месяцев (или отнять, если n отрицательное)

В функцию ADD_MONTHS() можно передать и дату и время:

SELECT
TO_CHAR(ADD_MONTHS(TO_DATE(‘31.10.2001 21:08:50‘, ‘fxDD.MM.YYYY HH24:MI:SS’)
, 4) — Добавить 4 месяца
, ‘DD.MM.YYYY HH24:MI:SS’)
FROM DUAL;

SELECT
TO_CHAR(ADD_MONTHS(TO_DATE(‘28.02.2001 21:08:50‘, ‘fxDD.MM.YYYY HH24:MI:SS’)
, -4) — Отнять 4 месяца
, ‘DD.MM.YYYY HH24:MI:SS’)
FROM DUAL;

Источник

Как получить первый и последний день недели в Oracle?

Мне нужно получить первый день и последний день недели из некоторых строк, которые имеют такой формат:

где 2011 год-это год, а 18-Это число недели. Зная номер недели, как мне получить первый и последний день недели?

Как мне это сделать?

14 ответов

Как получить первый день недели и последний день недели, когда мы вводим любой один день недели? Например, если мы вводим дату, то должны отображаться первый(понедельник) и последний (пятница) день. то есть если мы введем 24-jan-2014, то должны появиться 20-jan-2014 и 24-jan-2014. С уважением

Я хочу получить первый день текущей недели с конкретным locale для всех. Например, в US году неделя начинается с воскресенья, а в других странах-с понедельника. Я хочу начать в понедельник для всех, это потому, что я хочу использовать это для SQLQuery. У меня есть это: NSDate *weekDay = [NSDate.

WEEK

MONTH

Если вы используете Oracle, этот код может помочь вам:

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

Наличие такой таблицы позволяет очень легко фильтровать или агрегировать данные за нестандартные периоды в дополнение к обычным ISO неделям. Недели обычно ведут себя немного по-разному в разных компаниях и отделах внутри них. Как только вы покинете «ISO-land», встроенные функции даты не смогут вам помочь.

Вы можете либо создать дополнительные таблицы для «purchase_weeks» или «retail_weeks», либо просто агрегировать их на лету:

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

Можно ли получить последний день последней недели за текущий месяц. Например, я хочу получить 31-е число как последний день недели 5 в августе и 3-е число как последний день недели 1 в сентябре. Редактировать : Я использую эту неделю в качестве примера. На этой неделе есть 2 месяца, поэтому мне.

Вы могли бы попробовать такой подход:

Получите текущую дату.

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

Вычтите количество дней, которое является номером дня недели последней полученной даты (и это даст нам последний день какой-то недели).

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

Вычтите 6 дней, чтобы получить первый день.

На самом деле, я сделал что-то вроде этого:

Еще одно решение (понедельник-первый день):

Другим решением является

Вы должны связать кантвик с годом

Я думаю, что это просто простое утверждение select. Я надеюсь, что это сработает, потому что я не мог проверить это дома, потому что у меня здесь нет базы данных Oracle 😉

Вы должны быть осторожны, потому что есть разница между WW и IW. Вот статья, в которой объясняется разница: http://rwijk.blogspot.com/2008/01/дата-формат-элемент-ww.html

Первый день недели (понедельник):

Последний день недели (воскресенье):

Замена вашей даты или поля даты в этих формулах будет работать для вас!

Похожие вопросы:

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

В Oracle есть ли простой способ получить первый день недели, заданный номером недели? Например, сегодняшняя дата-12/4/2012. Если я выполню: выберите to_char(компания Новые системы, ‘WW’) от двойной;.

Как получить первый день недели и последний день недели, когда мы вводим любой один день недели? Например, если мы вводим дату, то должны отображаться первый(понедельник) и последний (пятница) день.

Я хочу получить первый день текущей недели с конкретным locale для всех. Например, в US году неделя начинается с воскресенья, а в других странах-с понедельника. Я хочу начать в понедельник для всех.

Можно ли получить последний день последней недели за текущий месяц. Например, я хочу получить 31-е число как последний день недели 5 в августе и 3-е число как последний день недели 1 в сентябре.

Я пытаюсь получить первый и последний день предыдущей недели в MySQL, где первый и последний дни-это понедельник и воскресенье соответственно. Например, если сегодня (1 марта 2017 года) выполняется.

Как получить дату первого дня недели и дату последнего дня недели с Moment.js? Мне нужно получить дату от первого дня недели до даты последнего дня текущей недели, которую я основываю на текущем.

Я пытаюсь получить первый день недели(понедельник) и последний день рабочей недели (пятница), когда я даю дату. Обычно датой, которая дается, является дата понедельника, но есть исключения.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *