PL/SQL - Date & Time: A Beginner's Guide

Здравствуйте, будущие маги PL/SQL! Сегодня мы отправляемся в увлекательное путешествие по миру дат и времени в PL/SQL. Не волнуйтесь, если вы никогда не писали ни строчки кода раньше - я буду вашим доброжелательным проводником, и мы будем двигаться шаг за шагом. К концу этого руководства вы будете работать с датами и временем, как профи!

PL/SQL - Date & Time

Понимание дат и времени в PL/SQL

Прежде чем мы углубимся в детали, давайте поговорим о том, почему даты и время так важны в программировании. Представьте, что вы создаете приложение для напоминаний о днях рождения или систему бронирования авиабилетов. Вам пришлось бы работать с датами постоянно! Вот где на помощь приходят функции дат и времени PL/SQL.

Краткий урок истории

Знаете ли вы, что компания Oracle, стоящая за PL/SQL, занимается датами с 1970-х годов? Это старше大多数人 из вас, кто читает это! За годы они усовершенствовали обработку дат и времени до невероятной точности и гибкости.

Значения полей для типов данных Datetime и Interval

Давайте начнем с азов. В PL/SQL у нас есть две основные категории для работы со временем: Datetime и Interval.

Типы данных Datetime

Типы данных Datetime представляют собой конкретную точку во времени. Представьте их как снимки. Основные типы datetime:

  1. DATE
  2. TIMESTAMP
  3. TIMESTAMP WITH TIME ZONE
  4. TIMESTAMP WITH LOCAL TIME ZONE

Типы данных Interval

Типы данных Interval представляют собой продолжительность времени. Представьте их как измерение расстояния между двумя точками во времени. Основные типы interval:

  1. INTERVAL YEAR TO MONTH
  2. INTERVAL DAY TO SECOND

Давайте посмотрим на таблицу, которая резюмирует эти типы:

Тип данных Описание Пример
DATE Дата с веками, годами, месяцами, днями, часами, минутами и секундами 01-JAN-2023 12:00:00
TIMESTAMP Дата и время с долей секунды 01-JAN-2023 12:00:00.000000
TIMESTAMP WITH TIME ZONE Время со временем зоны 01-JAN-2023 12:00:00.000000 -05:00
TIMESTAMP WITH LOCAL TIME ZONE Время relative к сессионному времени зоны 01-JAN-2023 12:00:00.000000
INTERVAL YEAR TO MONTH Период времени в годах и месяцах INTERVAL '1-3' YEAR TO MONTH
INTERVAL DAY TO SECOND Период времени в днях, часах, минутах и секундах INTERVAL '2 12:30:00' DAY TO SECOND

Типы данных Datetime и функции

Теперь, когда мы знаем, что такое datetime, давайте узнаем, как их использовать!

Работа с DATE

Тип DATE是最常用的。 Он хранит век, год, месяц, день, час, минуту и секунду.

Давайте посмотрим на несколько примеров:

-- Получить текущую дату
SELECT SYSDATE FROM DUAL;

-- Добавить 7 дней к текущей дате
SELECT SYSDATE + 7 FROM DUAL;

-- Получить разницу между двумя датами
SELECT TO_DATE('2023-12-31', 'YYYY-MM-DD') - SYSDATE AS days_until_new_year FROM DUAL;

В первом примере мы используем SYSDATE, чтобы получить текущую дату. Это как если бы вы спросили у своего компьютера: "Эй, какой сегодня день?"

Во втором примере показано, как легко выполнять арифметику с датами. Мы добавляем 7 дней к сегодняшней дате. Представьте, что вы планируете недельный отпуск - это было бы super полезно!

В третьем примере мы calculates, сколько дней осталось до Нового года. Мы используем TO_DATE, чтобы преобразовать строку в дату, затем вычитаем сегодняшнюю дату.

Работа с TIMESTAMP

TIMESTAMP как более точный cousin DATE. Он включает доли секунды, что很好, когда вам нужно отслеживать время до микросекунды.

-- Получить текущий тimestamp
SELECT SYSTIMESTAMP FROM DUAL;

-- Добавить 3 часа к текущему timestamp
SELECT SYSTIMESTAMP + INTERVAL '3' HOUR FROM DUAL;

-- Извлечь только часть даты из timestamp
SELECT TRUNC(SYSTIMESTAMP) FROM DUAL;

SYSTIMESTAMP даёт нам текущую дату и время с микросекундной точностью. Это как если бы у вас на запястье было super-точные часы!

Во втором примере показано, как мы можем добавлять временные интервалы к timestamp. Это может быть полезно в сценарии, где вы отслеживаете, сколько времени занимает процесс.

В последнем примере мы используем TRUNC, чтобы удалить временную часть от timestamp, давая нам только дату. Это удобно, когда вам важен только день, а не точное время.

Типы данных Interval и функции

Интервалы отлично подходят для измерения продолжительности времени. Давайте посмотрим на них в действии!

INTERVAL YEAR TO MONTH

Этот тип интервала идеально подходит для измерения более продолжительных периодов времени, таких как возраста или durations контрактов.

-- Calculate age
SELECT
'John Doe' AS name,
TO_DATE('1990-05-15', 'YYYY-MM-DD') AS birthdate,
SYSDATE AS current_date,
EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM TO_DATE('1990-05-15', 'YYYY-MM-DD'))
|| ' years ' ||
EXTRACT(MONTH FROM SYSDATE) - EXTRACT(MONTH FROM TO_DATE('1990-05-15', 'YYYY-MM-DD'))
|| ' months' AS age
FROM DUAL;

Этот пример calculates чей-то возраст в годах и месяцах. Мы используем EXTRACT, чтобы извлечь год и месяц частей дат, затем делаем простую арифметику. Это как магия - но это просто умелое использование PL/SQL!

INTERVAL DAY TO SECOND

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

-- Calculate duration of a task
DECLARE
start_time TIMESTAMP;
end_time TIMESTAMP;
duration INTERVAL DAY TO SECOND;
BEGIN
start_time := SYSTIMESTAMP;

-- Simulate a task that takes some time
DBMS_SESSION.SLEEP(5);

end_time := SYSTIMESTAMP;
duration := end_time - start_time;

DBMS_OUTPUT.PUT_LINE('Task duration: ' || duration);
END;
/

В этом примере мы измеряем, сколько времени занимает задача. Мы записываем время старта, выполняем что-то (в этом случае, мы просто ждем 5 секунд, используя DBMS_SESSION.SLEEP), затем записываем время окончания. Разница даёт нам продолжительность задачи.

Заключение

Поздравляю! Вы только что сделали свои первые шаги в мир дат и времени в PL/SQL. Мы рассмотрели основные типы данных, увидели, как работать с датами и timestamp, и даже немного окунулись в интервалы.

Помните, что практика делает мастера. Попробуйте поиграть с этими примерами, измените их и посмотрите, что произойдёт. Before you know it, вы будете работать с датами и временем, как erfahrener programmer!

Продолжайте программировать, продолжайте учиться и,最重要的是, получайте удовольствие! В конце концов, время летит, когда вы весело проводите время с PL/SQL! ?

Credits: Image by storyset