Oracle дата создания таблицы
По умолчанию Oracle выводит даты в формате DD-MON-YY, где YY - две последние цифры года:
select sysdate from dual;
При вставке в таблицу значений типа date, по умолчанию можно использовать литерал в формате
DD-MON-YYYY
(две цифры номера дня, три буквы месяца и четыре цифры года)
или использовать ключевое слово DATE для передачи в базу литерала типа data в формате ANSI
YYYY-MM-DD
(четыре цифры года, две цифры месяца, две цифры номера дня)
insert into t1 (d) values ( DATE '1971-04-28');
Конвертация даты в строку:
select to_char(sysdate) from dual;
select to_char(sysdate, 'DD') from dual; -- день
select to_char(sysdate, 'MONTH') from dual; --месяц
select to_char(sysdate, 'YYYY') from dual; -- год
select to_char(sysdate, 'HH24:MI:SS') from dual; -- часы, минуты, секунды
select to_char(sysdate, 'DD MONTH YYYY HH24:MI:SS') from dual; -- комбинация параметров формата
02 ИЮЛЬ 2014 17:00:51
select to_char(sysdate, 'CC') from dual; -- двузначное столетие (век)
select to_char(sysdate - 1000000, 'SCC') from dual; -- двузначное столетие (век), со знаком минус до нашей эры
select to_char(sysdate, 'Q') from dual; -- однозначный квартал года
Немного о стандарте ISO.
В стандарте ISO, год, относящийся к номеру недели ISO, может отличаться от календарного года.
1 января 1988 года попадает на 53-ю неделю ISO для 1987 года.
Неделя всегда начинается с понедельника и заканчивается воскресеньем.
Как связан год с номером недели по стандарту ISO:
Если 1 января падает на пятницу, субботу или воскресенье, то неделя, включающая 1 января,
считается последней неделей предыдущего года, потому что большинство дней этой недели
принадлежат предыдущему году.
Если 1 января падает на понедельник, вторник, среду или четверг, то эта неделя считается
первой неделей нового года, потому что большинство дней этой недели принадлежат новому году.
1 января 1991 падает на вторник, поэтому неделя с понедельника, 31 декабря 1990 по воскресенье, 6 января 1991 считается неделей 1.
Чтобы получить номер недели ISO, используйте маску формата 'IW' для номера недели и одну из масок вида 'IY' для года.
select to_char( DATE '1991-01-01', 'YYYY WW') from dual; -- в обычном календарном формате
select to_char( DATE '1991-01-01', 'IYYY IW') from dual; -- в формате по ISO
в данном случае результаты совпадают.
Попробуем с другой датой:
Как видим результаты разные.
При вставке в таблицу даты, рекомендуется указывать все четыре цифры года.
Если указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет интерпретировать в зависимости от того, какой формат был использован при вводе.
Если использовать формат YY, то в качестве столетия будет использовано текущее столетие,
которое в настоящее время установлено на сервере.
Неважно какой год мы указали, столетие всегда будет текущее (т.е. 20)
Если использовать формат YYYY но при этом указать только две последние цифры года
то в качестве столетия Oracle подставит нули (т.е. 00)
Если использовать формат RR и указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет вычислять по следующим правилам:
Если указанный год находится в интервале от 00 до 49 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 50 до 99,
то столетие при этом будет увеличено на 1 (текущее столетие + 1).
Если указанный год находится в интервале от 50 до 99 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 00 до 49,
то столетие при этом будет уменьшено на 1 (текущее столетие - 1).
Вобщем запомнить легко, если указанный год, больше текущего диапазона, значит столетие уменьшаем
и наоборот если указанный год, меньше текущего диапазона, значит столетие увеличиваем.
Интересно, а что будет если использовать формат RRRR, но при этом указать только две последние цифры года:
В качестве столетия Oracle не подставил нули, вывод аналогичен формату RR.
Для выделения первой цифры столетия в формате года можно использовать запятую:
select to_char(sysdate, 'Y,YYY') from dual; -- год с разделителем
Допустимые форматы года:
select to_char(sysdate, 'YYYY IYYY RRRR SYYYY Y,YYY YYY IYY YY IY RR Y I') from dual; -- год в различных форматах
2014 2014 2014 2014 2 014 014 014 14 14 14 4 4
А также год прописью:
select to_char(sysdate, 'YEAR') from dual; -- в верхнем регистре
select to_char(sysdate, 'Year') from dual; -- каждое слово с большой буквы
Форматы месяца:
select to_char(sysdate, 'MM') from dual; -- двузначный номер месяца
select to_char(sysdate, 'MONTH') from dual; -- полное название в верхнем регистре
select to_char(sysdate, 'Month') from dual; -- полное название с большой буквы
select to_char(sysdate, 'MON') from dual; -- три первые буквы в верхнем регистре
select to_char(sysdate, 'Mon') from dual; -- три первые буквы с большой буквы
select to_char(sysdate, 'RM') from dual; -- римскими цифрами
Форматы недели:
select to_char(sysdate, 'WW') from dual; -- двузначный номер недели года
select to_char(sysdate, 'IW') from dual; -- двузначный номер недели года по ISO
select to_char(sysdate, 'W') from dual; -- однозначный номер недели месяца
Форматы дня:
select to_char(sysdate, 'DDD') from dual; -- трехзначный номер дня года
select to_char(sysdate, 'DD') from dual; -- двузначный номер дня месяца
select to_char(sysdate, 'D') from dual; -- однозначный номер дня недели
select to_char(sysdate, 'DAY') from dual; -- полное название дня в верхнем регистре
select to_char(sysdate, 'Day') from dual; -- полное название дня с заглавной буквы
select to_char(sysdate, 'DY') from dual; -- первые две буквы названия в верхнем регистре
select to_char(sysdate, 'Dy') from dual; -- первые две буквы названия с заглавной буквы
select to_char(sysdate, 'J') from dual; -- Юлианский день - число дней, прошедшее с 1 января 4713 г. до нашей эры
Формат часов:
select to_char(sysdate, 'HH24') from dual; -- двузначный номер часа в 24 часовом формате
select to_char(sysdate, 'HH24 PM') from dual; -- с суффиксом
select to_char(sysdate, 'HH') from dual; -- двузначный номер часа в 12 часовом формате
select to_char(sysdate, 'HH PM') from dual; -- с суффиксом
select to_char(sysdate, 'HH A.M.') from dual; -- с суффиксом
Форматы минут:
select to_char(sysdate, 'MI') from dual; -- двузначное количество минут
Форматы секунд:
select to_char(sysdate, 'SS') from dual; -- двузначное количество секунд
Существует тип TIMESTAMP, который может хранить дробную часть секунд.
Необязательную точность представления секунд можно определить параметром FF[1..9]
Значение этого параметра по умолчанию равно 6 (справа от десятичной точки секунд можно поместить до 6 цифр)
При попытке поместить большее количество цифр в дробную часть секунд, значение дробной части будет округлено.
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF') FROM dual; -- шесть цифр после десятичной точки (по умолчанию)
2014-10-18 08:55.42.050000
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF3') FROM dual; -- три цифры после десятичной точки
2014-10-18 08:56.23.606
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI.SS.FF9') FROM dual; -- девять цифр после десятичной точки
2014-10-18 08:56.55.526000000
select to_char(sysdate, 'SSSSS') from dual; -- число секунд отсчитываемое от полуночи
В отчетах statspack применяются следующие обозначения долей секунд:
second (s)
centisecond (cs) - 100th of a second
millisecond (ms) - 1,000th of a second
microsecond (us) - 1,000,000th of a second
Символы, позволяющие разделять аспекты дат и времени.
- / , . ; : или любой текст в кавычках "текст"
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS') FROM dual;
2014-10-18 14:30.43
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD;HH24 "часов" MI "минут" SS "секунд"') FROM dual;
2014/10/18;14 часов 31 минут 18 секунд
AM или PM (A.M. или P.M.)
00:00 (полночь) 12:00 a.m.* (полночь)
12:00 (полдень) 12:00 p.m.* (полдень)
Проблемы в обозначениях полудня и полуночи:
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS AM') FROM dual;
2014-10-18 14:53.58 PM
AD или BC (A.D. или B.C.)
BC - до нашей эры
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI.SS BC') FROM dual;
2014-10-18 15:00.25 Н.З.
TH - суффикс для чисел
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;
2014th-10TH-18TH 17TH:56th.52ND Н.З.
SP - числовые значения записываются словами
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
EE - Полное название эпохи для японского календаря, календаря КНР и буддийского календаря.
E - Сокращенное название эпохи
select TO_DATE('H19-01-01' , 'EYY-MM-DD' , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') e_date
from dual;
select TO_DATE('平成19-01-01' , 'EEYY-MM-DD' , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') ee_date
from dual;
Часовые пояса:
В Oracle с версии 9i появилась возможность использовать различные часовые пояса.
Часовой пояс - это смещение от времени по Гринвичу(GMT).
Но теперь оно называется Всемирное скоординированное время(UTC).
Часовой пояс определяется либо как смещение относительно UTC, либо по имени региона (названию часового пояса).
Получить названия часовых поясов можно так:
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
.
При определении смещения используется формат HH:MI с префиксом в виде знака + или -
+/- HH:MI
Посмотрим какое смещение относительно 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;
sysdate() - возвращает значение даты и времени, установленных в ОС компьютера, на котором размещена БД.
current_date() - возвращает значение даты и времени для часового пояса вашего сеанса.
Для любого часового пояса можно найти величину смещения с помощью функции tz_offset().
select tz_offset('PST') from dual;
select tz_offset('Europe/Moscow') from dual;
TZH - время в часах часового пояса
TZM - минуты часового пояса
TZR - регион часового пояса
TZD - часовой пояс с информацией о переходе на летнее время
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' ;
Можно и явно задать формат
select to_date('April 28, 1971' , 'MONTH DD, YYYY') from dual;
Совместное использование to_date() и to_char()
Формат даты по умолчанию, можно использовать и при вставке строк в таблицу:
alter session set NLS_DATE_FORMAT = 'DD-MON-YYYY';
NLS - параметры:
National language_support (До Oracle9i)
Globalisation support (Начиная с Oracle9i)
Кодировка устанавливается только в переменных окружения!
Язык - RUSSIAN, AMERICAN
SELECT * FROM v$nls_valid_values
WHERE parameter = 'LANGUAGE'
ORDER BY value
CIS - СНГ
1. первый день недели
2. символ национальной валюты
(Если явно не задан параметр NLS_CURRENCY)
3. Десятичный и групповой разделители чисел
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
WE8ISO8859P1 - Западная Европа
Какие есть параметры NLS?
SELECT * FROM nls_session_parameters
PARAMETER VALUE
================ ==========
NLS_LANGUAGE=AMERICAN
NLS_TERRITORY=CIS
-- Символ нац. валюты
NLS_CURRENCY='р.'
-- Символ нац. валюты по стандарту ISO
NLS_ISO_CURRENCY='CIS'
-- Десятичный разделитель и разделитель групп
NLS_NUMERIC_CHARACTERS=', '
-- Календарь
NLS_CALENDAR=GREGORIAN
-- Формат ввода и вывода даты по-умолчанию
NLS_DATE_FORMAT='DD.MM.RR'
-- Язык для вывода названий месяцев и дней недели
NLS_DATE_LANGUAGE='AMERICAN'
-- Тип Сортировки
NLS_SORT=BINARY
-- . (нет описания)
NLS_TIME_FORMAT='HH24:MI:SSXFF'
-- Формат ввода и вывода даты типа TIMESTAMP по-умолчанию
NLS_TIMESTAMP_FORMAT='DD.MM.RR HH24:MI:SSXFF'
-- . (нет описания)
NLS_TIME_TZ_FORMAT='HH24:MI:SSXFF TZR'
-- Формат ввода и вывода даты типа TIMESTAMP с временнОй зоной по-умолчанию
NLS_TIMESTAMP_TZ_FORMAT='DD.MM.RR HH24:MI:SSXFF TZR'
-- Замещает символ нац. валюты, установленный по умолчанию параметром NLS_TERRITORY
NLS_DUAL_CURRENCY='р.'
-- Как сравнивать строки BINARY или ASCII (по правилам нац. алфавита)
NLS_COMP=BINARY
-- CHAR по умолчанию в байтах или в символах
NLS_LENGTH_SEMANTICS=BYTE
-- NLS_NCHAR_CONV_EXCP determines whether an error is reported when there is
-- data loss during an implicit OR explicit CHARACTER TYPE conversion.
-- The DEFAULT value results IN no error being reported.
NLS_NCHAR_CONV_EXCP=FALSE
Как можно устанавливать значения параметров NLS?
1. В системном реестре Windows
2. Установить переменные окружения
Для Windows (в bat-файле)
SET NLS_DATE_LANGUAGE=RUSSIAN
SET NLS_LANG=AMERICAN_CIS.CL8MSWIN1251
sqlplus .
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 отрицательное)
SELECT ADD_MONTHS('28.04.1971' , 13) FROM DUAL; -- Добавить 13 месяцев
SELECT ADD_MONTHS('28.04.1971' , -12) FROM DUAL; -- Отнять 12 месяцев
Я пытаюсь создать таблицу с третьей пятницей месяца для каждого месяца в прошлом году. Я знаю, как сделать это в течение одного месяца за раз, но у меня возникли проблемы с возвратом диапазона дат вместо этого. Я пытался сделать это с помощью for loop:
Нужно ли мне иметь массив для размещения этих значений или я ошибаюсь где-то еще?
4 ответа
Мне нужно включить сравнение дат в свой запрос, где я сравниваю строку даты со столбцом DATETIME , но мне нужно, чтобы она работала как с ORACLE, так и с SQL Server и не имела двух отдельных запросов. Существуют ли какие-либо сравнения дат, которые будут работать как на oracle, так и на sql.
Я хочу запустить модульные тесты, сгенерировав все таблицы в HSQLDB, присутствующие в моей базе данных oracle. Что я хочу, чтобы экспортировать все DDL создать таблицы ведомости от oracle таблицы. Я попробовал экспортировать базу данных, но вместе с create table sql я получаю много других SQLs.
Ты имеешь в виду что-то вроде этого?
ОБНОВЛЕНИЕ со ссылкой на комментарий @APC's:
Если вы не хотите полагаться на NLS_TERRITORY, вы можете сделать что-то вроде этого:
Вот немного неуклюжий, но в основном интуитивно понятный метод:
Одним из удобных способов решения этих сложных проблем с относительными датами является использование синтаксиса календаря DBMS_Schedular, о котором я писал здесь и здесь .
DBMS_Scheduler имеет очень полный синтаксис календаря, который хорошо подходит для сложных спецификаций календаря (как только вы привыкнете к нему), и функция Evaluate_Calendar_String возвращает следующий timestamp, который соответствует спецификации расписания после указанной даты.
Я думаю, что третья пятница каждого месяца будет:
Боюсь, что, к сожалению, у меня нет под рукой системы Oracle, чтобы проверить это.
Мне нужно создать представление в Oracle, которое отображает данные из таблицы SQL Server. Я не уверен, есть ли ссылка на базу данных в SQL Server, и если да, то как ее создать. кто-нибудь делал это раньше?
Я пытаюсь запустить координатора oozie для исторических дат, таких как start-date = 2013-02-01T00:00Z end-date = 2013-03-15T00:00Z frequency = 1 day Оози должен был немедленно начать/материализовать все действия на эти дни 2013-02-01T00:00Z 2013-02-02T00:00Z 2013-02-03T00:00Z 2013-02-04T00:00Z .
Похожие вопросы:
Возможно ли в СУБД oracle, чтобы пользователь имел разрешение на создание таблицы, но не имел разрешения на вставку в нее, хотя тот же пользователь только что создал ее? Заранее благодарю вас!
Я пишу отчет, который должен отображать значение в день. У меня есть дата начала и окончания запроса, но я хочу избежать пропущенных дней, если таблица не содержит значения для конкретной даты. Я.
Какие существуют стандарты и стратегии для обработки исторических дат, описанных в старой календарной форме? Современный Григорианский календарь с разной длиной месяцев, високосных лет и т. д.
Мне нужно включить сравнение дат в свой запрос, где я сравниваю строку даты со столбцом DATETIME , но мне нужно, чтобы она работала как с ORACLE, так и с SQL Server и не имела двух отдельных.
Я хочу запустить модульные тесты, сгенерировав все таблицы в HSQLDB, присутствующие в моей базе данных oracle. Что я хочу, чтобы экспортировать все DDL создать таблицы ведомости от oracle таблицы. Я.
Мне нужно создать представление в Oracle, которое отображает данные из таблицы SQL Server. Я не уверен, есть ли ссылка на базу данных в SQL Server, и если да, то как ее создать. кто-нибудь делал это.
Я пытаюсь запустить координатора oozie для исторических дат, таких как start-date = 2013-02-01T00:00Z end-date = 2013-03-15T00:00Z frequency = 1 day Оози должен был немедленно начать/материализовать.
Я создал временную таблицу в oracle sql developer, но забыл сохранить ее, и теперь я хочу повторно использовать запрос, но я не помню код, используемый тогда. Есть ли процесс получения запроса на.
Я хотел бы узнать имена таблиц, которые содержат значение, попадающее в определенный диапазон дат в разработчике oracle SQL. Если быть точным, таблицы в базе данных имеют те же столбцы, что и.
Я всего лишь самоучка по обработке запросов к данным и совершенно не знаком с созданием таблиц и тому подобным. В базе данных, над которой я работаю, есть календарная таблица, но это всего лишь.
Я хочу сохранить дату в формате «дд.мм.гггг». Поэтому я прочитал, что существуют разные форматы для даты в SQL (кстати, я использую Visual Studio и SQL Server).
Я пробовал этот код:
Но возвращает ошибку:
Неверный синтаксис рядом с 'FORMAT'.
После этого я хочу использовать этот код:
Вам не нужно указывать формат в определении таблицы, поскольку даты хранятся в двоичном формате.
Однако при попытке вставить в эту таблицу сервер попытается преобразовать строку в дату, прежде чем вставить ее. Это может быть проблематично, поскольку невозможно определить, является ли 12.11.2017 12 ноября или 11 декабря. Чтобы понять это, он использует настройки локализации учетной записи пользователя, который выполняет операцию.
Часто вы обнаружите, что для учетной записи, в которой выполняется операция, задан формат США: день месяца, а затем год (MDY), когда вы хотите использовать формат день месяц год (DMY). Один из способов определить последовательность частей даты - использовать DATEFORMAT, например, так:
Другой альтернативой является приведение строки к дате с использованием CONVERT и сообщите ей формат даты. Форматы имеют числовые коды как 104 для немецкого формата
Даты хранятся во внутреннем формате. Форматы имеют смысл только для ввода и вывода.
В вашем случае вам нужна дата в немецком формате (104), поэтому вы можете использовать:
При желании вы можете включить отформатированную дату в отдельный столбец:
Затем вы можете обратиться к dt_formatted , чтобы получить строку в нужном вам формате.
Его настройкой по умолчанию является гггг-мм-дд.
Нет, это не так. Информация о форматировании вообще не связана с полем.
Значение не отформатировано базой данных. Он возвращается только как момент времени. Форматирование этого значения в его текстовое представление выполняется приложением, которое получает данные из базы данных.
Таким образом, вы ничего не можете сделать в базе данных, чтобы изменить формат даты. Вы должны изменить это, где данные отображаются.
Статьи появились благодаря вопросам студентов на семинарах по СУБД. Каждый студент должен был выбрать тему для проектирования базы данных, реализовать полный цикл проектирования от логической и физической диаграммы в Oracle SQL Developer Data Modeler ( SDDM ) до работающей базы данных в СУБД Oracle с использованием APEX. Затем стать пользователем своей разработки: заполнить схему данными и написать аналитические запросы. Некоторые возможности SDDM оказались неочевидными и мы потратили полтора занятия, что бы рассмотреть самое необходимое.
Некоторым студентам, имеющим некоторый стихийно накопленный опыт разработки приложений с использованием СУБД, тяжело перестраиваться на анализ предметной области, трудно понять важность методик проектирования реляционной модели. Потому статья начнется с напоминания порядка разработки.
Не надо сразу делать таблицы. Порядок разработки следующий:
- анализ данных, процессов обработки информации и бизнес-правил, документирование собранной информации
- выявление и определение сущностей
- выявление, описание атрибутов сущностей, определение типов атрибутов
- выявление, описание и определение типов связей между сущностями
- создание матрицы связей и проверка идеи на прочность анализом матрицы связей, документирование бизнес-правил и ограничений
- создание логической диаграммы сущность-связь (ERD) в SDDM, в свойствах атрибутов и связей в том числе отражаются бизнес-правила и ограничения, те что не могут быть реализованы в СУБД описываются отдельным документом и реализуются на прикладном уровне триггерами
Статью готовил я, Присада Сергей Анатольевич, сейчас работаю в Финансовом университете при Правительстве РФ, почта sergey.prisada на яндексе.
План работы.
- Создание нескольких дисплеев для отображения различных нотаций.
- Естественные первичные ключи, или создаваемые вручную, их отображение.
- Соответствие атрибутов связи – правила создания и отображения. Шаблоны именования внешних ключей и иных объектов при преобразовании в реляционную модель.
- Идентификационный столбец или автоматическое создание последовательностей
- Полезная настройка SDDM
1. Создание нескольких дисплеев для отображения различных нотаций.
Выбрать его правой клавишей, далее “Properties”
Выбор нотации для каждого “Display”
2. Естественные первичные ключи, или создаваемые вручную, их отображение.
Перейдите в созданный “Display” с именем “Bachman”, в нотации Бахмана можно отобразить внешние ключи на диаграмме: в меню “View” – “View Details” – “All Details”. Отобразятся все свойства сущностей и связей, определённые в логической модели.
При создании связи между сущностями подразумевается связь между первичным уникальным идентификатором родительской сущности и одним из атрибутов дочерней сущности. При этом требуется, чтобы свойства атрибута дочерней сущности, объявляемого внешним ключом, были идентичны первичному уникальному идентификатору родительской сущности.
С целью облегчения проектирования, при создании логической модели SDDM автоматически создает атрибут для внешнего ключа в дочерней сущности. Самостоятельно его создавать не следует. Изменить это поведение нельзя. Имя создаваемого атрибута для вторичного ключа будет состоять из имени и имени первичного ключа родительской сущности с разделителем в виде символа нижнего подчеркивания “_”.
Две сущности, между ними создадим неопределяющую связь 1:N, рассмотрим свойство связи и созданный внещний ключ в свойствах дочерней сущности.
В дочерней сущности “Course” автоматически создан внешний ключ “Department_Dept_name”
Свойства созданного внешнего ключа нельзя изменить, они соответствуют свойству PUID родительской сущности. Можно изменить имя созданного атрибута для внешнего ключа.
В свойствах созданного атрибута для внешнего ключа можно указать изменить его обязательсть чекбокс “M” – это повлияет на свойство обязательности связи. Также можно внешний ключ включить в состав первичного ключа – в этом случае связь будет определяющей.
Удобнее смотреть свойства всех атрибутов в виде таблицы на вкладке “Overview”.
ВАЖНО: при логическом проектировании не требуется заранее определять атрибуты для внешних ключей. Цель логического проектирования – создание логической модели и приведение её минимум к третьей нормальной форме. Внешние ключи являются атрибутами, которые согласно анализу информации, будут являться характеристиками сущности, которые имеют транзитивную зависимость (вторая нормальная форма), поэтому при декомпозиции отношения они должны быть устранены из сущности в другую сущность. Если на логической диаграмме до создания связей в свойствах сущностей есть атрибуты для внешних ключей, то сущности не приведены к третье нормальной форме, а атрибуты на диаграмме дублируются. Дублирующихся атрибутов не должно быть.
Поэтому нет возможности при логическом проектировании свободно назначить атрибут для внешнего ключа. Это задача проектирования реляционной модели. Следует создать сущности в третьей нормальной форме без повторения атрибутов в сущностях на диаграмме, а затем построить связи в соответствии с матрицей связей.
3. Соответствие атрибутов связи – правила создания и отображения. Шаблоны именования внешних ключей и иных объектов при преобразовании в реляционную модель.
Создаваемые автоматически атрибуты внешних ключей, имена ограничений внешних ключей, первичные ключи, индексы и иные объекты, при преобразовании в реляционную модель не всегда имеют удобные для обработки человеком наименования. Если создаваемая база данных будет использоваться только информационными системами, такими как сетевые сервисы или серверы приложений, то лучше оставить автоматические имена. Это гарантирует их уникальность, а правила генерации имён отображают логику и понятный алгоритм их создания. Для удобства работы человека нужно использовать псевдонимы объектов – “Alias”, а также заранее создавать пакеты и процедуры. При этом, в SDDM предусмотрен механизм настройки правил именования автоматически создаваемых объектов.
Выбрать модель, правой клавишей, “Properties”.
Шаблоны именований создаваемых автоматически объектов настриваются в разделе настроек “Settings” – “Naming Standart” – “Templates”. Все возможные переменные отобразятся при нажатии “Add Variable”.
Типы объектов — это термины из реляционной модели и должны быть понятны интуитивно. Переменные, доступные для использования в шаблонах имён, описаны в поле комментарий интерфейса. Дополнительная информация в официальной документации к SDDM.
В качестве примера изменим значение шаблона именования атрибута внешнего ключа, что бы создаваемое имя совпадало с именем атрибута первичного ключа родительской сущности. Изменять надо два шаблона: для логической и реляционной модели
Шаблон для реляционной модели называется “Column Foreign Key”:
Шаблон для логической модели называется “Attribute Relation”:
Пересоздадим связь между сущностями, преобразуем в реляционную модель и рассмотрим имена созданных атрибутов в логической модели и внешних ключей в реляционной модели.
Имена атрибутов связи в логической модели.
Имена столбцов внешних ключей в реляционной модели.
4. Идентификационный столбец или автоматическое создание последовательностей
В зависимости от типа и версии используемой РСУБД, можно настроить, что бы автоматически создавались последовательности. Включить это можно в настройках. Начиная с версии 12с можно использовать простой механизм Identity collumns, подробнее в документации. Однако рекомендую использовать TRIGGER и SEQUENCE. Это более универсальный механизм, потому что SEQUENCE может использоваться для непересекающейся нумерации строк в разных таблицах, базах данных, на разных серверах.
Выбор механизма в настройках SDDM
5. Полезная настройка SDDM
Для работы с создаваемым кодом настройте формат создаваемого скрипта DDL. Выберите удобные вам отступы, формат, прописные или строчные буквы.
Третья часть будет посвящена обзору методик именования объектов проектируемых баз данных.
Четвертая часть будет посвящена настройке связи (dblink) с SQL Server и MySQL
Пятая часть будет примером создания веб-сервиса API с использованиям ORDS в гетерогенной среде, т.е. с доступом к данным хранимым помимо Oracle, в SQL Server и MySQL
Верно. :) И не просто аналог, а натуральная системная вьюха (view), коих много.
а что есть вьюха, как не виртуальная таблица? :)
Это уже метафизика пошла, драться не буду, так и быть. ;)
SELECT create_date FROM sys.tables WHERE name='mycustomers'sys.tables - ето таблица время создания которой определяем?
WHERE name='mycustomers' - ето тогда название етой таблици или что ето?
вот у меня есть таблица players, БД називаеться football.
Как мне определить когда била создана таблица, и когда последний раз было изменение в ней?
И можна ето просмотреть по БД а не по таблицам. )
Это системное представление (view), содержащее информацию о таблицах в базе. Поле name содержит символьное имя таблиц, поле create_date - дату создания таблицы в базе, поле modify_date - дату последнего изменения объекта таблицы (дату исполнения ALTER TABLE).
вот у меня есть таблица players, БД називаеться football.Как мне определить когда била создана таблица, и когда последний раз было изменение в ней? SELECT create_date FROM football.sys.tables WHERE name = 'players' Дату последнего изменения данных в таблице придется поддерживать вручную, например создать отдельную таблицу и повесить триггеры на целевые таблицы.
У нас каждая модель, которая хранится в базе, имеет поля creation_user, creation_date, last_modified_user,last_modified_date etc. Много логики на самом деле на этом основано (в области планирования ресурсов, логистики и т.п.).
Кроме того, опционально, для многих моделей существуют таблицы полного аудита (т.е. при каждом изменение/удалении записи в таблице table_name, добавляется строка в таблицу table_name_adt). Таблица полного аудита содержит точно такие же колонки, что и основная таблица для модели + last_action_used (UPDATE/DELETE), modification_date, modification_user и несколько других, нужных для отслеживания изменений.
Обновляются они row-level триггерами (чаще всего).
:(когда я ето пишу у меня ошыбу выдает.
ну я забыл сказать я пользуюсь MySQL, сдесь ето сделать реально. :(
когда я ето пишу у меня ошыбу выдает.
ну я забыл сказать я пользуюсь MySQL, сдесь ето сделать реально.
Не холивара ради, конечно..но все же по сравнению с тем что я видел в Oracle 11 как то не очень мне это.
Не холивара ради, конечно..но все же по сравнению с тем что я видел в Oracle 11 как то не очень мне это.
Читайте также:
- Вывести рекурсивно на экран список файлов и каталогов в директории var log
- Не видит устройства ноутбук g710
- Построение моделей и создание чертежей деталей в системе autodesk inventor учебное пособие
- На берегах озера неро между москвой и ярославлем стоит ростов великий ныне небольшой город
- Скрап механик на андроид как на компьютере