Смещение даты на заданную величину

Задача
Вы хотите сдвинуть указанную дату на заданную величину для получения новой даты.

Решение
Используйте функции DATE_ADD() или DATE_SUB().

Обсуждение
Если у вас есть исходная дата и требуется получить из нее другую, отличающуюся на заданный интервал, то обычно задача решается элементарнымиарифметическими операциями при помощи функций DATE_ADD() и DATE_SUB().

Примеры: вычисление памятных дат, определение сроков годности или нахождение записей, удовлетворяющих запросам типа «этот день в истории».

Вычисление памятных дат
Предположим, что ваша свадьба состоялась 6 августа 2003 года, и вы не хотите ждать целый год вашу первую годовщину свадьбы, чтобы выказать преданность своей половине. Вместо этого вы хотели бы приготовить специальные подарки на 1 неделю, 1 месяц, 3 месяца и 6 месяцев со дня свадьбы. Чтобы узнать, когда они наступят, выполните смещение даты вашей свадьбы на указанные интервалы:

mysql> SET @d = '2003-08-06';
mysql> SELECT @d AS 'start date',
-> DATE_ADD(@d,INTERVAL 7 DAY) AS '1 week',
-> DATE_ADD(@d,INTERVAL 1 MONTH) AS '1 month',
-> DATE_ADD(@d,INTERVAL 3 MONTH) AS '3 months',
-> DATE_ADD(@d,INTERVAL 6 MONTH) AS '6 months';

+--------------+----------------+--------------+---------------+--------------+
| start date | 1 week | 1 month | 3 months | 6 months |
+--------------+----------------+--------------+---------------+--------------+
| 2003-08-06 | 20-03-08-13 | 2003-09-06 | 2003-11-06 | 2004-02-06 |
+--------------+----------------+--------------+---------------+--------------+

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


Например, если вы закончили школу 4 июня 2000 года и хотите узнать, в каком году состоятся встречи по случаю 10-й, 20-й и 40-й годовщины окончания, то нет необходимости применять функцию DATE_ADD(). Просто извлеките из исходной даты часть, относящуюся к году, и добавьте к ней 10, 20 и 40 с помощью обычных арифметических операций:

mysql> SET @y = YEAR('2000-06-04');
mysql> SELECT @y + 10, @y + 20, @y + 40;

+-----------+-----------+-----------+
| @y + 10 | @y + 20 | @y + 40 |
+-----------+-----------+-----------+
| 2010 | 2020 | 2040 |
+-----------+-----------+-----------+

Учет часовых поясов
Сервер MySQL возвращает даты, соответствующие тому часовому поясу, где находится хост, на котором работает сервер. Если клиентская программа запускается в другом часовом поясе, следует изменить значения на локальное время клиента с помощью функции DATE_ADD(). Чтобы преобразовать время для сервера, который на два часа опережает клиента, вычтем два часа:

mysql> SELECT dt AS 'server time',
-> DATE_ADD(dt,INTERVAL -2 HOUR) AS 'client time'-> FROM datetime_val;

+--------------------------+--------------------------+
| server time | client time |
+--------------------------+--------------------------+
| 1970-01-01 00:00:00 | 1969-12-31 22:00:00 |
| 1987-03-05 12:30:15 | 1987-03-05 10:30:15 |
| 1999-12-31 09:00:00 | 1999-12-31 07:00:00 |
| 2000-06-04 15:45:30 | 2000-06-04 13:45:30 |
+--------------------------+--------------------------+

Имейте в виду, что у сервера нет никакой информации о часовом поясе клиента, так что именно вы должны определить величину смещения времени клиента.


В сценарии это можно сделать, получив текущее локальное время и сравнив его с представлением сервера о локальном времени. В Perl для таких случаев есть функция localtime():

my ($sec, $min, $hour, $day, $mon, $year) = localtime (time ());
my $now = sprintf ("%04d-%02d-%02d %02d:%02d:%02d",
$year + 1900, $mon + 1, $day, $hour, $min, $sec);
my ($server_now, $adjustment) = $dbh->selectrow_array (
"SELECT NOW(), UNIX_TIMESTAMP(?) - UNIX_TIMESTAMP(NOW())",
undef, $now);
print "client now: $now\n";
print "server now: $server_now\n";
print "adjustment (secs): $adjustment\n";.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Выбор записей по временным характеристикам
Вывод значений TIMESTAMP в удобном для чтения виде
Вычисление возраста
Вычисление длины месяца
Вычисление интервалов между значениями времени

Вернуться в раздел: MySQL / 5. Работа с датами и временем