Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Язык структурированных запросов и основы web-программирования. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Для типов time, timestamp и interval можно указывать необязатель­ное значение точности p, которое задает количество дробных разрядов после запятой. По умолчанию точность в явном виде не указывается. Допустимый диапазон значения p – от 0 до 6 для типов timestamp и interval.
Если значения timestamp хранятся как восьмибайтное целое число (по умолчанию это так), то в пределах всего диапазона стигается точность в одну микросекунду. Если значения timestamp хранятся как число с плавающей запятой двойной точности (в случае выбора устаревшей опции при компиляции), то эффективное ограни­чение на точность может быть меньше 6. Значения timestamp хранятся как количество секунд перед или после 2000-01-01. Когда значения timestamp реализуются с использованием чисел с плавающей точкой, микросекундная точность достигается для дат, которые находятся внутри отрезка, начинающегося с 2000-01-01, но эта точность снижа­ется для дат вне этого отрезка.
Для типов time разрешается следующий диапазон p: от 0 до 6 – ес­ли для хранения значений используется восьмибайтное целое; от 0 до 10 – если используется число с плавающей запятой.
Тип interval имеет дополнительную опцию, которая чивать набор сохраняемых полей с помощью одной из следующих фраз:
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEAR TO
MONTH, DAY TO HOUR, DAY TO MINUTE, DAY TO SECOND,
HOUR TO MINUTE, MINUTE TO SECOND.
значений до-
должна ограни-
Вводимые данные, попадающие за пределы указанного набора по­лей, отбрасываются. Если указаны и поля, и точность, то поля должны включать SECOND, так как точность применима только к секундам.
Вводимые значения даты и времени принимаются в любом разумном
формате, POSTGRES и др. Для некоторых форматов порядок следования полей
дня, месяца и года в значении даты является неоднозначным, и для та­ких форматов поддерживается указание порядка следования этих полей.
Любые вводимые значения даты или времени необходимо заклю­чать в одиночные кавычки, как и текстовые строки. В этом необходимо использовать следующий синтаксис:
включая ISO 8601, SQL-совместимый, традиционный формат
случае
тип [ (p) ] 'значение' ,
21
где p является необязательной спецификацией точности, которая зада­ется целым числом, соответствующим количеству дробных разрядов во втором поле.
Точность может быть задана для типов time, timestamp и interval. Допустимые значения были рассмотрены выше. Если точность в спе­цификации константы не указана, то она устанавливается в значение по умолчанию для литеральных значений.
В табл. 1.7 показаны
некоторые возможные формы ввода данных
для типа date.
Таблица 1.7
Ввод значений даты
Пример Описание
1999-01-08
January 8, 1999
1/8/1999 8 января – в режиме MDY; 1 августа – в режиме DMY 1/18/1999
01/02/03
1999-Jan-08 8 января – в любом режиме Jan-08-1999 8 января – в любом режиме 08-Jan-1999 8 января – в любом режиме 99-Jan-08 8 января – в режиме YMD, иначе будет ошибка 08-Jan-99
Jan-08-99
ISO 8601; 8 января – в любом режиме (рекомендуемый
формат) Значение является однозначным для любого datestyle
режима ввода
18 января – в режиме MDY; в других режимах значение будет отвергнуто
2 января 2003 г. – в режиме MDY; 1 февраля 2003 г. – в режиме DMY; 3 февраля 2001 г. – в режиме YMD
8 января – за исключением режима YMD, в котором будет ошибка
8 января – за исключением режима YMD, в котором будет ошибка
Типами времени являются time [ (p) ] without time zone и time [ (p) ] with time zone. Тип time эквивалентен типу time without time zone.
Правильные вводимые значения для этих типов состоят из времени дня, за которым следует необязательное значение часового пояса. Также можно задать дату, но она будет проигнорирована, за исключе-
22
нием случая, когда используется имя часового пояса, который реализу­ет переход на летнее/зимнее время, как, например, America/New_York. В этом случае требуется указание даты, чтобы понять, летнее или зим­нее время нужно применять. Соответствующее смещение часового по­яса записывается в значение time with time zone.
Правильные вводимые значения для типа даты и времени состоят из слитного тельное значение часового пояса, а далее идет необязательный суф­фикс AD или BC. (В качестве альтернативы AD/BC могут указываться перед часовым поясом, но так делать не рекомендуется.)
Таким образом,
являются правильными значениями, которые соответствуют стандарту
ISO 8601. В дополнение поддерживается формат стандарта
значения даты и времени, за которым следует необяза-
1999-01-08 04:05:06 и 1999-01-08 04:05:06-8:00
January 8 04:05:06 1999 PST.
Стандарт SQL различает литералы zone и timestamp with time zone по наличию символа «+» или «-»
и смещения часового пояса, которое задается после времени. Следова­тельно, значение
TIMESTAMP '2004-10-19 10:23:54'
соответствует типу timestamp without time zone, в то время как значение
TIMESTAMP '2004-10-19 10:23:54+02'
имеет тип timestamp with time zone.
PostgreSQL никогда не проверяет содержимое строки литерала, пе-
ред тем как определить его тип, и таким образом будет считать оба приведенных выше варианта убедиться, что литерал распознается как timestamp with time zone, при­дайте ему правильный для этого типа вид
TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' .
В литерале, который распознан как timestamp without timezone, PostgreSQL будет игнорировать любые указания часового пояса. Таким
образом, итоговое значение будет получено из полей даты/времени, которые присутствуют во вводимом значении, и не будет скорректиро­вано по часовому поясу.
как timestamp without time zone. Чтобы
типов timestamp without time
23
Преобразования между типами timestamp without time zone и timestamp with time zone обычно означают, что значение timestamp without time zone должно быть принято или выдано как значение мест­ного времени часового пояса, указанного в переменной timezone. Для преобразования с помощью AT TIME ZONE может быть задан другой часовой пояс.
Вычисление интервалов времени
Вычисление интервала времени доступно для всех типов данных. Если в операции участвуют только переменные
с типом date, то ре­зультатом будет целое число, означающее количество дней между ука­занными датами.
Пример 1.14. Определить количество дней между датами. Ниже
приведена соответствующая команда.
SELECT '2021-01-05'::date - '2021-01-01'::date AS result;
На рис. 1.25 демонстрируется результат выполнения команды.
Рис. 1.25. Число дней между датами
Если при вычислении интервала между датами есть хотя бы одна переменная с типом timestamp, то результатом вычисления будет зна­чение с типом interval.
Пример 1.15. Определить количество дней между датами при ис­пользовании переменной типа timestamp. Ниже приведена соответ­ствующая команда.
SELECT '2021-01-05'::timestamp - '2021-01-01'::timestamp AS result;
Результат выполнения команды демонстрируется на рис. 1.26.
Рис. 1.26. Количество дней между датами
24
В арифметических операциях при вычислении интервала времени можно использовать разные типы данных. В этом случае date преобра­зуется в timestamp.
Пример 1.16. Выполнить операцию уменьшения значения времени с использованием переменной типа timestamp.
SELECT '2021-01-05'::timestamp - '2021-01-01'::timestamp AS result;
Результат выполнения команды показан на рис. 1.27.
Рис. 1.27. Уменьшение значения времени
Пример 1.17. Выполнить операцию уменьшения значения времени
на один час с использованием переменных типа timestamp и interval.
SELECT '2021-01-05'::timestamp - '1 hour'::interval AS result;
Результат выполнения команды для этого случая демонстрируется на рис. 1.28.
Рис. 1.28. Уменьшение значения времени на один час
Пример 1.18. Выполнить операцию для увеличения значения вре-
мени на один месяц, один день, одну минуту с использованием пере­менных типа date и interval.
SELECT '2021-05-06'::date + interval '1 month 1 day 1 minute' AS result;
На рис. 1.29 показан результат увеличения значения времени на за­данный интервал.
Рис. 1.29. Увеличение значения времени на заданный интервал
25
Интервалы времени можно складывать и вычитать между собой, делить и умножать на произвольные вещественные числа.
Пример 1.19. Изменить значение времени с помощью переменной типа interval и дополнительной опции minute.
SELECT interval '1 minute' * 109 AS result;
Результат выполнения команды демонстрируется на рис. 1.30.
Рис. 1.30. Результат работы с командой interval
Пример 1.20. Определить разность интервалов времени с помощью
переменной типа interval и дополнительных опций hour и minute.
SELECT interval '1 hour' - interval '23 minutes' AS result;
На рис. 1.31 приведен результат определения разности двух задан­ных интервалов времени.
Рис. 1.31. Разность интервалов времени
Пример 1.21. Определить сумму интервалов времени с помощью
указанной ниже команды.
SELECT interval '1 hour 37 minutes' + interval '43 minutes' AS result;
На рис. 1.32 показан результат вычисления суммы двух заданных интервалов времени.
Рис. 1.32. Сумма двух интервалов времени
26
Специальные значения времени
В PostgreSQL есть строковые константы, которые преобразуются в реальные значения времени в момент выполнения запроса, например, функция today возвращает текущую дату, а функция now – текущую дату с временем. Функцию today можно вызвать с помощью команды, представленной ниже.
SELECT ('today')::timestamp, now()::date;
Пример 1.22. Выполнить операцию округления времени до даты с помощью переменной типа
timestamp.
SELECT (timestamp '2021-06-12 20:11')::date;
На рис. 1.33 демонстрируется результат операции округления при­менительно к дате и времени.
Рис. 1.33. Операция округления
Пример 1.23. Выполнить операцию округления времени до месяца
с помощью функции date_trunc, переменной типа timestamp и допол­нительной опции month.
SELECT date_trunc('month', timestamp '2021-06-12 20:11');
На рис. 1.34 приведен результат работы функции date_trunc.
Рис. 1.34. Функция date_trunc
Пример 1.24. Выполнить операцию округления времени до года
с помощью функции date_trunc, переменной типа timestamp и допол­нительной опции year.
SELECT date_trunc('year', timestamp '2021-06-12 20:11');
27
На рис. 1.35 показан результат операции округления времени до года с помощью функции date_trunc. Аналогично можно выполнить округление времени до недели или квартала.
Рис. 1.35. Округление времени до года
Для получения полей времени применяются функции EXTRACT или date_part.
SELECT EXTRACT(year FROM now()), date_part('year', now()),
now()::date;
Ниже приведены наиболее часто используемые поля времени, которые также можно получить с помощью функций EXTRACT или date_part:
day – день месяца;
decade – номер десятилетия;
dow – день недели, где 0 – воскресенье, 6 – суббота;
month – месяц;
quarter – квартал (с первого по четвертый квартал);
week – номер недели года;
year – год.
Контрольные вопросы
1. Каким образом можно выполнить связывание таблиц?
2. Какие типы связывания используются наиболее часто?
3. С какой целью используется связывание таблиц?
4. Как формируется подзапрос?
5. Как задается параметр для отбора данных в подзапросе?
6. В каких случаях используются многотабличные запросы?
7. Как задается критерий отбора данных в многотабличных зап-
росах
?
8. Что такое внутреннее объединение?
9. Что такое левое внешнее объединение?
28
10. Что такое правое внешнее объединение?
11. Что такое полное внешнее объединение?
12. Сколько типов объединений существует?
13. Чем типы объединения отличаются друг от друга?
14. Каким образом можно создать одномерный массив?
15. Каким образом можно осуществить вставку значений в поля-
массивы?
16. Как выполнить выборку отдельного элемента массива?
17. Какая
из массива?
18. Каким образом можно узнать количество значений, хранящих-
ся в массиве?
19. Каким образом можно выполнить полную модификацию массива?
20. В каких ситуациях используется конструкция IS NOT NULL?
21. Какая команда позволяет вычислять максимальное значение?
22. Какая команда позволяет вычислять среднее значение?
23. Какая
24. Для чего используется функция COUNT(*)?
25. В каком случае используется функция SUM?
26. Какие бывают типы дат и времени?
27. Чем отличаются timestamp и date?
28. Для чего нужна команда EXTRACT?
29. Какие операции можно выполнять при работе с интервалами
времени?
30. Какие возможности предоставляет команда interval?
31. Какой результат получится
ния для time и interval?
32. Какой результат получится, если отнять число от date?
команда дает возможность выполнить срез при выборке
команда позволяет вычислять минимальное значение?
, если выполнить операцию сложе-
29
2. ОСНОВЫ WEB-ПРОГРАММИРОВАНИЯ
2.1. Модель клиент/сервер: браузеры и web-серверы
В общем случае модель клиент/сервер описывает взаимодействие между двумя компьютерами, в соответствии с которым клиент запра­шивает у сервера услуги, а сервер выполняет запрос. Иными словами модель клиент/сервер – это модель взаимодействия компьютеров или программных средств.
В модели клиент/сервер применительно к WWW (World Wide Web) рассматривается взаимодействие не компьютеров, а программных средств: в роли клиента, как правило, выступает web-браузер, в роли сервера – web-сервер.
На сайте W3Schools (http://www.w3schools.com/browsers/browsers_ stats.asp [12]) можно посмотреть статистику использования браузеров начиная с 2002 г. и по настоящее время, сайт Netcraft предоставляет данные о статистике использования web-серверов (http://news.netcraft.
com).
Web-браузер и web-сервер обмениваются данными с помощью протокола HTTP (HyperText Transfer Protocol). Сетевой протокол HTTP, разработанный специально для передачи гипертекстовых доку-
ментов формата HTML (HyperText Markup Language), в настоящий момент используется для передачи не только html-документов, но и произвольных данных.
В работе протокола HTTP важную роль играет URL (Uniform Resource Locator) – стандартизированный способ записи адресов html­документов, изображений, загружаемых файлов и других ресурсов в WWW. Основной синтаксис URL достаточно прост:
protocol://host:port/path?data,
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]