Oracle получить дату время
В БД Oracle для работы с датами предназначены 2 типа - DATE и TIMESTAMP .
Отдельно можно упомянуть INTERVAL - интервальный тип, который хранит диапазон между двумя датами.
ADD_MONTHS
Функция add_months добавляет указанное количество месяцев к дате. Для того, чтобы отнять месяцы от даты, нужно передать в качестве второго параметра отрицательное число:
Тип TIMESTAMP
Тип TIMESTAMP является расширением типа DATE . Он также, как и тип DATE , позволяет хранить год, месяц, день, часы, минуты и секунды. Но пимимо всего этого в TIMESTAMP можно хранить доли секунды.
TIMESTAMP - максимально точный тип данных для хранения даты, точнее в ORACLE уже нет.
При описании колонки с типом TIMESTAMP можно указать точность, с которой будут храниться доли секунды. Это может быть число от 0 до 9. По умолчанию это значение равно 6.
Пример создания таблицы с колонкой типа TIMESTAMP :
Колонка logout_time может хранить доли секунды с точностью до 6 знаков после запятой, а колонка login_time - с точностью до 8 знаков.
ДЛЯ ЧЕГО НУЖНЫ ДВА ТИПА INTERVAL
Поначалу меня несколько удивило то, что Oracle ввела сразу два типа данных INTERVAL . Решение обрабатывать годы и месяцы отдельно от дней, часов минут и секунд выглядело довольно странно. Почему бы не создать единый тип данных INTERVAL , покрывающий все возможности? Однако оказалось, что за это нужно благодарить римского императора Юлия Цезаря (создателя юлианского календаря), определившего продолжительность большинства месяцев.
Два типа данных с разделительной линией на уровне месяцев пришлось определить потому, что месяц — это единственный компонент даты/времени с непостоянной продолжительностью. Возьмем интервал в 1 месяц и 30 дней. Какова его фактическая продолжительность? Меньше двух месяцев? Ровно два месяца? А может быть, больше? Если месяцем является январь, то через 30 дней уже наступит март, и получится интервал в 61 день, что уже несколько больше «двух месяцев». Если же этим месяцем является февраль, тогда интервал равен либо 59, либо 60 дням. Ну а если месяц — апрель, тогда интервал составит 60 дней.
Вместо того чтобы возиться со всеми этими сложностями, обусловленными разной продолжительностью месяцев и возникающими при сравнении интервалов, математических операциях с датами, а также при нормализации значений даты/времени, стандарт ISO SQL разбивает модель даты/времени на две части: в одной — год и месяц, во второй — все остальное. За дополнительной информацией по этому вопросу обращайтесь к книге A Guide to the SQL Standard (автор C.J. Date, издательство Addison-Wesley).
Большинство приложений выполняют те или иные операции со значениями даты и времени. Работать с датами довольно сложно; кроме того что приходится иметь дело с жестким форматированием данных, существует множество правил определения их допустимых значений и проведения корректных вычислений (приходится учитывать високосные годы, национальные праздники и выходные, диапазоны дат и т. д.). К счастью, СУБД Oracle и PL/SQL предоставляют набор типов данных для хранения даты и времени в стандартном внутреннем формате.
Для любого значения даты или времени Oracle сохраняет некоторые (или все) из перечисленных составляющих: год, месяц, день, час, минуты, секунды, часовой пояс, смещение часового пояса в часах, смещение часового пояса в минутах.
Впрочем, поддержка типов даты и времени — только часть дела. Еще необходим язык, средства которого позволяют удобно и естественно работать с этими значениями. Oracle обеспечивает разработчиков исчерпывающим набором функций для выполнения все-возможных операций с датами и временем.
В течение долгого времени для работы с датой и временем в Oracle поддерживался только тип DATE . В Oracle9i ситуация немного изменилась: появились три новых типа TIMESTAMP и два новых типа INTERVAL . Они предоставляют много новых полезных возможностей, одновременно улучшая совместимость Oracle со стандартом ISO SQL. Типы данных INTERVAL подробно рассматриваются позднее в моем блоге, а пока остановимся на четырех основных типах даты/времени.
- DATE
Хранит значение даты и времени с точностью до секунд. Не содержит информации часового пояса. - TIMESTAMP
Хранит значение даты и времени без информации о часовом поясе. Эквивалентен типу данных DATE, отличаясь от него лишь тем, что время хранится с точностью до миллиардной доли секунды. - TIMESTAMP WITH TIME ZONE
Хранит вместе со значением даты и времени информацию о часовом поясе с точностью до девяти десятичных позиций. - TIMESTAMP WITH LOCAL TIME ZONE
Хранит значение даты и времени с точностью до девяти десятичных позиций. Значения этого типа автоматически преобразуются между часовым поясом базы данных и местным (сеансовым) часовым поясом. При хранении в базе данных значения преобразуются к часовому поясу базы данных, а при выборке они преобразуются к местному (сеансовому) часовому поясу.
Разобраться во всех особенностях этих типов, особенно TIMESTAMP WITH LOCAL TIME ZONE , бывает непросто. Для примера рассмотрим использование типа TIMESTAMP WITH LOCAL TIME ZONE в календарном приложении для пользователей, работающих в разных часовых поясах. В качестве времени базы данных используется всеобщее скоординированное время UTC (Universal Coordinated Time — см. далее врезку «Всеобщее скоординированное время»). Пользователь Джонатан, живущий в Мичигане (Восточный часовой пояс, смещение от UTC составляет –4:00), запланировал проведение видеоконференции с 16:00 до 17:00 в четверг по своему местному времени. У Донны из Денвера (Горный часовой пояс, смещение составляет –6:00) конференция приходится на промежуток времени с 14:00 до 15:00 в четверг. У Селвы из Индии (смещение +5:30) конференция пройдет с 01:30 до 02:30 в пятницу. На рис. 1 показано, как время начала конференции изменяется при выборке из базы данных пользователями из разных часовых поясов.
Рис. 1. Разные типы значений даты-времени
На рис. 1 пользователь Джонатан находится в Восточном часовом поясе с действием летнего времени, в котором время отстает от UTC на 4 часа (UTC-4:00). Джонатан вводит время начала собрания 16:00. Это значение преобразуется к часовому поясу базы данных (UTC) при вставке записи, и в базе данных сохраняется значение 20:00.
Донна находится в Денвере, где также действует летнее время; текущее время отстает от UTC (UTC-6:00). Когда Донна выбирает время начала встречи, значение преобразуется к сеансовому часовому поясу и отображается в формате 14:00. Селва находится в Индии, где летнее время не действует — индийское стандартное время смещено на 5,5 часа вперед от UTC (UTC+5:30). Когда Селва выбирает время начала встречи, значение преобразуется к сеансовому часовому поясу и выводится в формате 1:30.
Поручая преобразования часовых поясов типу данных TIMESTAMP WITH LOCAL TIME ZONE , вы избавляетесь от необходимости программирования сложных правил, связанных с часовыми поясами и летним временем (которое иногда изменяется, как это было в США в 2007 году), а заодно избавляете ваших пользователей от необходимости разбираться с преобразованиями. Правильное время будет предоставляться каждому пользователю просто и элегантно.
В одних случаях база данных должна автоматически изменять формат вывода времени, в других это не нужно. Если вы не хотите, чтобы формат значения времени изменялся в соответствии с сеансовыми настройками, используйте тип данных TIMESTAMP или TIMESTAMP WITH TIME ZONE .
Всеобщее скоординированное время
Всеобщее скоординированное время, обозначаемое сокращением UTC (Coordinated Universal Time), измеряется с применением высокоточных атомных часов и закладывает основу для мировой системы гражданского времени. Например, все часовые пояса определяются их смещением от UTC. Время UTC измеряется по атомному эталону и периодически регулируется через механизм корректировочных секунд для поддержания синхронизации с временем, определяемым по вращению Земли.
Возможно, вы также знакомы с временем по Гринвичскому меридиану, или GMT (Greenwich Mean Time). Как правило, в практическом контексте это обозначение эквивалентно UTC.
Почему выбрано сокращение UTC, а не CUT? Комитет по стандартизации не мог решить, стоит ли использовать английское сокращение CUT или французское TUC, поэтому сошлись на сокращении UTC, которое не соответствует ни одному языку.
Тип DATE
Тип DATE используется чаще всего, когда необходимо работать с датами в БД Oracle. Он позволяет хранить даты с точностью до секунд.
Некоторые БД, например MySQL, также имеют тип DATE, но там может храниться дата лишь с точностью до дня.
Приведение строки к timestamp
Для приведения строки к типу timestamp используется фукнция TO_TIMESTAMP :
В запросе выше следует обратить внимание на то, как указывается точность долей секунды. ff3 будет сохранять точность до тысячных долей секунды, ff9 - до максимальных 9-и разрядов.
Форматы строк для приведения к датам очень разнообразны. Здесь приведены варианты, которые чаще всего понадобятся на практике. Ознакомиться со всеми форматами строк можно в докумениации.
Oracle реализует набор функций для работы со значениями типа даты/времени. Мы не будем подробно рассматривать все функции, но сводка в табл. 1 познакомит Вас с доступными возможностями. Если какие-то функции вас заинтересуют, обращайтесь за подробным описанием к справочнику Oracle SQL Reference.
Избегайте использования традиционных функций Oracle, обрабатывающих значения типа DATE , при работе с новыми типами данных TIMESTAMP . Вместо них следует по возможности использовать новые функции для типов INTERVAL . А DATE -функции должны использоваться только для обработки значений типа DATE .
Многие из приведенных в табл. 1 функций (в том числе ADD_MONTHS ) получают значения типа DATE . При использовании таких функций с новыми типами данных TIMESTAMP могут возникнуть проблемы. Хотя любой из этих функций можно передать значение типа TIMESTAMP , Oracle неявно преобразует его к типу DATE , и только тогда функция выполнит свою задачу, например:
В этом примере переменная ts содержит значение типа TIMESTAMP WITH TIME ZONE . Это значение неявно преобразуется в DATE при передаче LAST_DAY . Поскольку в типе DATE не сохраняются ни дробные части секунд, ни смещение часового пояса, эти части значения ts попросту отбрасываются. Результат LAST_DAY снова присваивается ts , что приводит к выполнению второго неявного преобразования — на этот раз DATE преобразуется в TIMESTAMP WITH TIME ZONE . Второе преобразование получает часовой пояс сеанса, поэтому в смещении часового пояса в итоговом значении мы видим ?05:00.
Очень важно понимать эти преобразования. и избегать их. Несомненно, вы представляете, какие коварные ошибки могут появиться в программе из-за неосторожного использования функций DATE со значениями TIMESTAMP . Честно говоря, я не представляю, почему в Oracle встроенные функции DATE не были перегружены для нормальной работы с TIMESTAMP . Будьте осторожны!
В любом языке программирования важно знать, как получить текущую дату и время. Обычно это один из самых первых вопросов, возникающих при работе с датами в приложениях. До выхода Oracle8i в PL/SQL существовал только один способ получения даты и времени: функция SYSDATE . Начиная с Oracle9i, в вашем распоряжении появились все функции из табл. 10.1. От вас лишь требуется понять, как они работают и какие преимущества дает тот или иной вариант.
Функция | Часовой пояс | Тип возвращаемого значения |
CURRENT_DATE | Сеанс | DATE |
CURRENT_TIMESTAMP | Сеанс | TIMESTAMP WITH TIME ZONE |
LOCALTIMESTAMP | Сеанс | TIMESTAMP |
SYSDATE | Сервер базы данных | DATE |
SYSTIMESTAMP | Сервер базы данных | TIMESTAMP WITH TIME ZONE |
Какую же функцию использовать в конкретной ситуации? Ответ зависит от нескольких факторов, которые, вероятно, стоит рассматривать в следующем порядке:
- Если вы используете версию, предшествующую Oracle8i, или должны обеспечить совместимость с ней, выбор небогат: используйте SYSDATE .
- Какое время вас интересует — вашего сеанса или сервера базы данных? В первом случае используйте функцию, возвращающую сеансовое время, а во втором — функцию, возвращающую часовой пояс базы данных.
- Должен ли часовой пояс возвращаться в составе текущей даты и времени? Если должен, используйте функцию SYSTIMESTAMP или CURRENT_TIMESTAMP .
Если будет выбрана функция, возвращающая сеансовое время, проследите за тем, чтобы часовой пояс сеанса был задан правильно. Информацию о часовом поясе сеанса и базы данных можно получить при помощи функций SESSIONTIMEZONE и DBTIMEZONE соответственно. Чтобы получить время в часовом поясе базы данных, необходимо изменить часовой пояс сеанса на DBTIMEZONE , а затем использовать одну из сеансовых функций.
Примеры использования этих функций:
В этом примере сеанс начинается в Восточном часовом поясе (–4:00), тогда как сервер работает по времени Центрального часового пояса (–5:00), но при этом в самой базе данных используется время GMT (+00:00). Чтобы получить время в часовом поясе базы данных, мы сначала приводим часовой пояс сеанса в соответствие с часовым поясом базы данных, а затем вызываем функцию часового пояса сеанса CURRENT_TIMESTAMP . Наконец, часовой пояс сеанса снова возвращается с исходному местному значению.
Если вы используете эти функции для хронометража на уровне долей секунд, помните об ограничениях операционной системы и оборудования. Функции CURRENT_TIMESTAMP , LOCALTIMESTAMP и SYSTIMESTAMP возвращают значения в типах данных TIMESTAMP WITH TIME ZONE или TIMESTAMP , позволяющих определять время с разрешением до миллиардной доли секунды.
Все это, конечно, замечательно, но подумайте, откуда берется это время. База данных получает его от операционной системы в результате вызова GetTimeOfDay (Unix/ Linux), GetSystemTime (Microsoft Windows) или другой аналогичной функции операционной системы. В свою очередь, операционная система зависит от оборудования. Если операционная система или используемое оборудование способны отслеживать время с точностью до сотых долей секунды, база данных не сможет возвращать результаты с большей точностью. Например, в системе Linux на процессоре Intel x86 вы сможете отслеживать время с точностью до миллионной доли секунды (шесть цифр), тогда как при работе базы данных в Microsoft Windows XP или Vista на том же оборудовании обеспечивается точность до тысячной доли секунды. Кроме того, хотя операционная система может возвращать временной штамп с шестью знаками, результат может не соответствовать реальной точности в одну микросекунду.
Что делать, если функции, возвращающей нужный тип данных, не существует — например, если время сервера нужно получить в переменной TIMESTAMP ? Можно доверить неявное преобразование типов базе данных, но лучше воспользоваться явным преобразованием CAST . Пример:
Вызов SYSTIMESTAMP использует CAST для явного преобразования TIMESTAMP WITH TIME ZONE в TIMESTAMP . При вызове SYSDATE преобразование DATE в TIMESTAMP выполняется неявно.
Разница между датами
Если просто отнять от одной даты другую, то мы получим разницу между ними в днях. Также, к датам можно прибавлять и отнимать обычные числа, и Oracle будет оперировать ими как днями:
Функция SYSDATE
Данная функция возвращает текущую дату. В зависимости от того, когда следующий запрос выполнится, значение SYSDATE будет всегда разным.
12.7 Date and Time Functions
This section describes the functions that can be used to manipulate temporal values. See Section 11.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats in which values may be specified.
Table 12.11 Date and Time Functions
Name | Description |
---|---|
ADDDATE() | Add time values (intervals) to a date value |
ADDTIME() | Add time |
CONVERT_TZ() | Convert from one time zone to another |
CURDATE() | Return the current date |
CURRENT_DATE() , CURRENT_DATE | Synonyms for CURDATE() |
CURRENT_TIME() , CURRENT_TIME | Synonyms for CURTIME() |
CURRENT_TIMESTAMP() , CURRENT_TIMESTAMP | Synonyms for NOW() |
CURTIME() | Return the current time |
DATE() | Extract the date part of a date or datetime expression |
DATE_ADD() | Add time values (intervals) to a date value |
DATE_FORMAT() | Format date as specified |
DATE_SUB() | Subtract a time value (interval) from a date |
DATEDIFF() | Subtract two dates |
DAY() | Synonym for DAYOFMONTH() |
DAYNAME() | Return the name of the weekday |
DAYOFMONTH() | Return the day of the month (0-31) |
DAYOFWEEK() | Return the weekday index of the argument |
DAYOFYEAR() | Return the day of the year (1-366) |
EXTRACT() | Extract part of a date |
FROM_DAYS() | Convert a day number to a date |
FROM_UNIXTIME() | Format Unix timestamp as a date |
GET_FORMAT() | Return a date format string |
HOUR() | Extract the hour |
LAST_DAY | Return the last day of the month for the argument |
LOCALTIME() , LOCALTIME | Synonym for NOW() |
LOCALTIMESTAMP , LOCALTIMESTAMP() | Synonym for NOW() |
MAKEDATE() | Create a date from the year and day of year |
MAKETIME() | Create time from hour, minute, second |
MICROSECOND() | Return the microseconds from argument |
MINUTE() | Return the minute from the argument |
MONTH() | Return the month from the date passed |
MONTHNAME() | Return the name of the month |
NOW() | Return the current date and time |
PERIOD_ADD() | Add a period to a year-month |
PERIOD_DIFF() | Return the number of months between periods |
QUARTER() | Return the quarter from a date argument |
SEC_TO_TIME() | Converts seconds to 'hh:mm:ss' format |
SECOND() | Return the second (0-59) |
STR_TO_DATE() | Convert a string to a date |
SUBDATE() | Synonym for DATE_SUB() when invoked with three arguments |
SUBTIME() | Subtract times |
SYSDATE() | Return the time at which the function executes |
TIME() | Extract the time portion of the expression passed |
TIME_FORMAT() | Format as time |
TIME_TO_SEC() | Return the argument converted to seconds |
TIMEDIFF() | Subtract time |
TIMESTAMP() | With a single argument, this function returns the date or datetime expression; with two arguments, the sum of the arguments |
TIMESTAMPADD() | Add an interval to a datetime expression |
TIMESTAMPDIFF() | Subtract an interval from a datetime expression |
TO_DAYS() | Return the date argument converted to days |
TO_SECONDS() | Return the date or datetime argument converted to seconds since Year 0 |
UNIX_TIMESTAMP() | Return a Unix timestamp |
UTC_DATE() | Return the current UTC date |
UTC_TIME() | Return the current UTC time |
UTC_TIMESTAMP() | Return the current UTC date and time |
WEEK() | Return the week number |
WEEKDAY() | Return the weekday index |
WEEKOFYEAR() | Return the calendar week of the date (1-53) |
YEAR() | Return the year |
YEARWEEK() | Return the year and week |
Here is an example that uses date functions. The following query selects all rows with a date_col value from within the last 30 days:
The query also selects rows with dates that lie in the future.
Functions that expect date values usually accept datetime values and ignore the time part. Functions that expect time values usually accept datetime values and ignore the date part.
Functions that return the current date or time each are evaluated only once per query at the start of query execution. This means that multiple references to a function such as NOW() within a single query always produce the same result. (For our purposes, a single query also includes a call to a stored program (stored routine, trigger, or event) and all subprograms called by that program.) This principle also applies to CURDATE() , CURTIME() , UTC_DATE() , UTC_TIME() , UTC_TIMESTAMP() , and to any of their synonyms.
The CURRENT_TIMESTAMP() , CURRENT_TIME() , CURRENT_DATE() , and FROM_UNIXTIME() functions return values in the current session time zone, which is available as the session value of the time_zone system variable. In addition, UNIX_TIMESTAMP() assumes that its argument is a datetime value in the session time zone. See Section 5.1.13, “MySQL Server Time Zone Support”.
Some date functions can be used with “ zero ” dates or incomplete dates such as '2001-11-00' , whereas others cannot. Functions that extract parts of dates typically work with incomplete dates and thus can return 0 when you might otherwise expect a nonzero value. For example:
Other functions expect complete dates and return NULL for incomplete dates. These include functions that perform date arithmetic or that map parts of dates to names. For example:
Several functions are strict when passed a DATE() function value as their argument and reject incomplete dates with a day part of zero: CONVERT_TZ() , DATE_ADD() , DATE_SUB() , DAYOFYEAR() , TIMESTAMPDIFF() , TO_DAYS() , TO_SECONDS() , WEEK() , WEEKDAY() , WEEKOFYEAR() , YEARWEEK() .
Fractional seconds for TIME , DATETIME , and TIMESTAMP values are supported, with up to microsecond precision. Functions that take temporal arguments accept values with fractional seconds. Return values from temporal functions include fractional seconds as appropriate.
When invoked with the INTERVAL form of the second argument, ADDDATE() is a synonym for DATE_ADD() . The related function SUBDATE() is a synonym for DATE_SUB() . For information on the INTERVAL unit argument, see Temporal Intervals.
When invoked with the days form of the second argument, MySQL treats it as an integer number of days to be added to expr .
ADDTIME() adds expr2 to expr1 and returns the result. expr1 is a time or datetime expression, and expr2 is a time expression.
CONVERT_TZ() converts a datetime value dt from the time zone given by from_tz to the time zone given by to_tz and returns the resulting value. Time zones are specified as described in Section 5.1.13, “MySQL Server Time Zone Support”. This function returns NULL if the arguments are invalid.
If the value falls out of the supported range of the TIMESTAMP type when converted from from_tz to UTC, no conversion occurs. The TIMESTAMP range is described in Section 11.2.1, “Date and Time Data Type Syntax”.
To use named time zones such as 'MET' or 'Europe/Amsterdam' , the time zone tables must be properly set up. For instructions, see Section 5.1.13, “MySQL Server Time Zone Support”.
Returns the current date as a value in ' YYYY-MM-DD ' or YYYYMMDD format, depending on whether the function is used in string or numeric context.
Trunc
Функция trunc округляет дату до определенной точности. Под точностью в округлении даты следует понимать ту ее часть(день, месяц, год, час, минута), которая не будет приведена к единице, а будет такой же, как и в исходной дате.
Если не указывать формат округления, то trunc округлит до дней, т.е. колонки “2” и “3” будут содержать одинаковое значение.
Выбор типа данных
Естественно, при таком богатстве выбора хочется понять, из каких соображений следует выбирать тип данных для представления даты/времени в той или иной ситуации. В значительной степени выбор типа данных зависит от требуемой детализации:
- Чтобы хранить время с точностью до долей секунды, используйте один из типов TIMESTAMP .
- Чтобы время автоматически преобразовывалось между часовыми поясами базы данных и сеанса, используйте тип TIMESTAMP WITH LOCAL TIME ZONE.
- Чтобы отслеживать часовой пояс сеанса, в котором были введены данные, используйте тип TIMESTAMP WITH TIME ZONE.
- Вы можете использовать TIMESTAMP вместо DATE. TIMESTAMP без долей секунд занимает 7 байт, как и тип данных DATE . При хранении долей секунд он занимает 11 байт.
Также могут действовать и другие факторы:
- Используйте DATE в тех ситуациях, в которых необходимо сохранить совместимость с существующим приложением, написанным до появления типов данных TIMESTAMP .
- В общем случае рекомендуется использовать в коде PL/SQL типы данных, соответствующие типам используемых таблиц базы данных (или по крайней мере совместимые с ними). Например, дважды подумайте, прежде чем читать значение TIMESTAMP из таблицы в переменную DATE , потому что это может привести к потере информации (в данном случае — долей секунд, и возможно, часового пояса).
- Если вы работаете с версией старше Oracle9i Database, у вас нет выбора — придется использовать DATE .
- При сложении и вычитании годов и месяцев поведение функции ADD_MONTHS , работающей со значениями типа DATE , отличается от поведения интервальных арифметических операций с типами TIMESTAMP . За дополнительной информацией по этому важному, но неочевидному вопросу обращайтесь к разделу «Когда используются типы INTERVAL ».
Будьте осторожны при совместном использовании типов данных DATE и TIMESTAMP . Правила арифметических операций для этих типов сильно различаются. Будьте внимательны при использовании традиционных встроенных функций даты Oracle (таких, как ADD_MONTHS или MONTHS_BETWEEN ) к значениям типов TIMESTAMP . См. далее раздел «Арифметические операции над значениями даты/времени».
MySQL 5.7 Reference Manual Including MySQL NDB Cluster 7.5 and NDB Cluster 7.6
Объявление переменных даты и времени в PL/SQL
Синтаксис объявления переменной, представляющей дату и время, выглядит так:
Поле тип заменяется одним из следующих типов:
Значение параметра точность определяет количество десятичных цифр, выделяемое для хранения долей секунды. По умолчанию оно равно 6, то есть время может отслеживаться с точностью до 0,000001 секунды. Допускаются значения от 0 до 9, позволяющие сохранять время суток с высокой точностью.
Функции, возвращающие значения типа TIMESTAMP (например, SYSTIMESTAMP ), всегда возвращают данные с шестью цифрами точности.
Несколько примеров объявлений:
Исходное_значение задается либо при помощи функции преобразования (например, TO_TIMESTAMP ), либо с использованием литерала даты/времени. Оба варианта описаны далее в разделе «Преобразования даты и времени».
Поведение переменной типа TIMESTAMP(0) идентично поведению переменной типа DATE .
Months_between
Функция months_between возвращает разницу между датами в месяцах:
EXTRACT
Функция extract позволяет извлечь из даты определенные составные части, например получить только год, или только месяц и т.п.
Извлекаемые части имеют числовой тип данных, т.е. колонки year , month и day всего лишь числа.
Несмотря на то, что тип DATE хранит также время вплоть до секунд, получить часы, минуты или секунды нельзя:
В ответ мы получим ошибку ORA-30076: invalid extract field for extract source .
Но если использовать тип TIMESTAMP , то помимо года, месяца и дня с помощью функции EXTRACT можно по отдельности получить значение часов, минут и секунд:
SYSTIMESTAMP
Данная функция работает так же, как и SYSDATE , только она возвращает текущую дату в формате TIMESTAMP :
Приведение даты к строке
Чтобы отобразить дату в нужном нам формате, используется функция to_char .
Приведение строки к дате
Одна из часто встречающихся ситуаций - необходимость представить строку в виде типа данных DATE . Делается это при помощи функции to_date . Данная функция принимает 2 параметра - строку, содержащую в себе собственно дату, и строку, которая указывает, как нужно интерпретировать первый параметр, т.е. где в этой дате год, где месяц, число и т.п.
На самом деле, функция to_date может работать и без строки с форматом даты, а также с еще одним дополнительным параметром, который будет указывать формат языка, но мы будем рассматривать вариант с двумя параметрами. Более детально ознакомиться с функцией to_date можно вот здесь.
Как видно, строка, определяющая формат даты, имеет очень большое значение. В примере выше, мы получили две разные даты, изменив лишь их формат в функции to_date .
Читайте также: