Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Язык структурированных запросов и основы web-программирования. Учебное пособие
.pdf
Для типов 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
