alan_beaulieu-learning_sql-ru (865932), страница 26
Текст из файла (страница 26)
Обязательные компоненты датТипФормат по умолчаниюDateYYYYMMDDDatetimeYYYYMMDD HH:MI:SSTimestampYYYYMMDD HH:MI:SSTimeHHH:MI:SS143Временные данныеЗагрузка данных часового пояса MySQLЕсли сервер MySQL выполняется на платформе Windows, то прежде чем настраивать глобальные или сеансовые часовые пояса,пользователю необходимо загрузить данные часовых поясов вручную. Для этого надо сделать следующее:1.
Скачать данные часового пояса по адресу http://dev.mysql.com/downloads/timezones.html.2. Остановить сервер MySQL.3. Извлечь файлы из загруженного zipфайла (в моем случаеэтот файл назывался timezone2004e.zip) и поместить егов подкаталог /data/mysql каталога установки MySQL (полный путь для моей установки был /Program Files/MySQL/MySQL Server 4.1/data/mysql).4.
Вновь запустить сервер MySQL.Чтобы посмотреть данные часового пояса, необходимо перейтик базе данных mysql с помощью команды use mysql и выполнитьследующий запрос:mysql> SELECT name FROM time_zone_name;++| name|++| Africa/Abidjan|| Africa/Accra|| Africa/Addis_Ababa|| Africa/Algiers|| Africa/Asmera|| Africa/Bamako|| Africa/Bangui|| Africa/Banjul|| Africa/Bissau|| Africa/Blantyre|| Africa/Brazzaville|| Africa/Bujumbura|...| US/Alaska|| US/Aleutian|| US/Arizona|| US/Central|| US/EastIndiana|| US/Eastern|| US/Hawaii|| US/IndianaStarke|| US/Michigan|| US/Mountain|| US/Pacific|144Глава 7.
Создание, преобразование и работа с данными| US/Samoa|| UTC|| WSU|| WET|| Zulu|++545 rows in set (0.01 sec)Чтобы изменить настройки своего часового пояса, надо выбратьодно из имен из предыдущего запроса, наиболее соответствующее вашему местоположению.Таким образом, чтобы заполнить столбец типа datetime показаниямивремени 3:30 после полудня 27 марта 2005 года, понадобиться создатьследующую строку:'20050327 15:30:00'Если сервер ожидает значение datetime, как при обновлении столбцатипа datetime или при вызове встроенной функции, принимающей аргумент datetime, можно предоставить правильно форматированнуюстроку с необходимыми компонентами даты, и сервер выполнит преобразование сам. Вот, например, выражение для корректировки датыбанковской операции:UPDATE transactionSET txn_date = '20050327 15:30:00'WHERE txn_id = 99999;Сервер определяет, что предоставленная строка блока set должна бытьзначением типа datetime, поскольку строка используется для заполнения столбца типа datetime.
Следовательно, сервер попытается преобразовать эту строку, разбирая ее на шесть компонентов (год, месяц, день,час, минута, секунда), включенные в формат datetime по умолчанию.Преобразования строки в датуЕсли сервер не ожидает значение типа datetime, необходимо указатьему преобразовать строку в тип datetime.
Вот, например, простой запрос, возвращающий значение типа datetime с помощью функцииcast() (привести):mysql> SELECT CAST('20050327 15:30:00' AS DATETIME);++| CAST('20050327 15:30:00' AS DATETIME) |++| 20050327 15:30:00|++1 row in set (0.00 sec)Временные данные145Функция cast() будет рассмотрена в конце данной главы. Хотя этотпример демонстрирует построение значений типа datetime, аналогичная логика применятся и к типам date и time.
Следующий запрос использует функцию cast() для формирования значения типа date и значения типа time:mysql> SELECT CAST('20050327' AS DATE) date_field,> CAST('108:17:57' AS TIME) time_field;+++| date_field | time_field |+++| 20050327 | 108:17:57 |+++1 row in set (0.00 sec)Конечно, можно явно преобразовывать строки, даже когда серверожидает значение date, datetime или time, а не полагаться на неявноепреобразование, выполняемое сервером.При явном или неявном преобразовании строк во временные значениявсе компоненты даты должны быть предоставлены в требуемом порядке. Некоторые серверы очень строги относительно формата даты, носервер MySQL довольно мягок в отношении разделителя компонентов.Например, MySQL примет все нижеприведенные строки как допустимые представления времени 3:30 дня 27 марта 2005 года:'20050327 15:30:00''2005/03/27 15:30:00''2005,03,27,15,30,00''20050327153000'Хотя это и обеспечивает немногим большую гибкость для вас, возможна ситуация, в которой требуется сформировать временное значение безстандартных компонентов даты.
В следующем разделе будут представлены встроенные функции, гораздо более гибкие, чем функция cast().Функции для создания датЕсли требуется сгенерировать временные данные из строки, и формастроки не позволяет использовать функцию cast(), можно обратитьсяк встроенной функции, позволяющей предоставить вместе со строкойдаты строку форматирования.
MySQL включает для этой цели функцию str_to_date(). Например, для обновления столбца date из файлаизвлекается строка 'March 27, 2005'. Строка не соответствует требуемому формату YYYYMMDD, но вместо того чтобы переформатироватьее, делая пригодной для применения функции cast(), можно воспользоваться функцией str_to_date():UPDATE individualSET birth_date = STR_TO_DATE('March 27, 2005', '%M %d, %Y')WHERE cust_id = 9999;146Глава 7. Создание, преобразование и работа с даннымиВторой аргумент в вызове str_to_date() определяет формат строки даты.
В данном случае это название месяца (%M), число (%d) и четырехзначное число, обозначающее год (%Y). Есть более 30 общепринятыхкомпонентов форматирования. В табл. 7.4 приведено около десятканаиболее широко используемых компонентов.Таблица 7.4. Компоненты форматирования датыКомпонент форматированияОписание%MНазвание месяца (от January до December)%mНомер месяца (от 01 до 12)%dЧисло (от 01 до 31)%jДень года (от 001 до 366)%WДни недели (от Sunday до Saturday)%YГод, четырехзначное число%yГод, двузначное число%HЧас (от 00 до 23)%hЧас (от 01 до 12)%iМинуты (от 00 до 59)%sСекунды (от 00 до 59)%fМикросекунды (от 000000 до 999999)%pA.M.
или P.M.Функция str_to_date() возвращает значение типа datetime, date илиtime в зависимости от содержимого форматирующей строки. Например, если форматирующая строка включает только %H, %i и %s, будетвозвращено значение типа time.В распоряжении пользователей Oracle Database имеется функция to_date(), с которой можно работать так же, как с функциейMySQL str_to_date().При формировании текущей даты/времени создавать строку не требуется – следующие встроенные функции организуют доступ к системным часам и возвратят текущую дату и/или время в виде строки:mysql> SELECT CURRENT_DATE( ), CURRENT_TIME( ), CURRENT_TIMESTAMP( );++++| CURRENT_DATE( ) | CURRENT_TIME( ) | CURRENT_TIMESTAMP( ) |++++| 20050320| 22:15:56| 20050320 22:15:56 |++++1 row in set (0.00 sec)Возвращаемые этими функциями значения имеют формат по умолчанию для возвращаемого временного типа.
В Oracle Database есть функ147Временные данныеции current_date() и current_timestamp(), но нет функции current_time().SQL Server включает только функцию current_timestamp().Работа с временными даннымиВ данном разделе рассматриваются встроенные функции, принимающие аргументы даты и возвращающие даты, строки или числа.Временные функции, возвращающие датыМногие встроенные временные функции принимают в качестве аргумента одну дату и возвращают другую. Например, функция MySQLdate_add() позволяет добавить любой интервал (т.
е. дни, месяцы, года)к заданной дате, чтобы получить другую дату. Вот пример, демонстрирующий, как добавить к текущей дате пять дней:mysql> SELECT DATE_ADD(CURRENT_DATE( ), INTERVAL 5 DAY);++| DATE_ADD(CURRENT_DATE( ), INTERVAL 5 DAY) |++| 20050326|++1 row in set (0.00 sec)Второй аргумент заключает в себе три элемента: ключевое слово interval(интервал), требуемое количество и тип интервала. В табл.
7.5 приведены некоторые широко используемые типы интервалов.Таблица 7.5. Общепринятые типы интерваловИнтервалОписаниеSecondКоличество секундMinuteКоличество минутHourКоличество часовDayКоличество днейMonthКоличество месяцевYearКоличество летMinute_secondКоличества минут и секунд, разделенные двоеточиемHour_secondКоличества часов, минут и секунд, разделенные двоеточиемYear_monthКоличества лет и месяцев, разделенные дефмсомПервые шесть типов, перечисленные в табл.
7.5, довольно просты, а последние три требуют немного более подробного объяснения, посколькусодержат по несколько элементов. Например, если оказалось, что операция с ID 9999 на самом деле имела место на 3 часа 27 минут и 11 секунд позже того значения, которое было отправлено в таблицу Transaction, исправить это можно следующим образом:148Глава 7. Создание, преобразование и работа с даннымиUPDATE transactionSET txn_date = DATE_ADD(txn_date, INTERVAL '3:27:11' HOUR_SECOND)WHERE txn_id = 9999;В этом примере функция берет значение столбца txn_date, добавляетк нему 3 часа 27 минут и 11 секунд и изменяет столбец txn_date, вставляя в него результирующее значение.Или если в отделе кадров обнаруживают, что сотрудник с ID 4789 позаписанным данным моложе, чем на самом деле, можно добавить к дате его рождения, скажем, 9 лет и 11 месяцев:UPDATE employeeSET birth_date = DATE_ADD(birth_date, INTERVAL '911' YEAR_MONTH)WHERE emp_id = 4789;Для пользователей SQL Server предыдущий пример можно было бы реализовать с помощью функции dateadd():UPDATE employeeSET birth_date =DATEADD(MONTH, 119, birth_date)WHERE emp_id = 4789В SQL Server нет комбинированных интервалов (т.