+
|
TIME
|
TIMESTAMP (арифметическая конкатенация)
|
DATE
|
+
|
Числовое значение n**
|
DATE, увеличенная на n целых дней (игнорируется дробная часть n, если указана)
|
TIME
|
+
|
DATE
|
TIMESTAMP (арифметическая конкатенация)
|
TIME
|
+
|
Числовое значение n**
|
TIME, увеличенное на n секунд*
|
TIMESTAMP
|
+
|
Числовое значение n**
|
TIMESTAMP, где дни увеличены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64 x 10(^5^))
|
DATE
|
-
|
DATE
|
Количество дней в интервале: DECIMAL(9,0)
|
DATE
|
-
|
Числовое значение N**
|
DATE, уменьшенная на n дней (игнорируется дробная часть n, если указана)
|
TIME
|
-
|
TIME
|
Количество секунд в интервале: DECIMAL(9,4)
|
TIME
|
-
|
Числовое значение n**
|
TIME, уменьшенное на n секунд*
|
TIMESTAMP
|
-
|
TIMESTAMP
|
Количество дней и части дня в интервале: DECIMAL (18, 9)
|
TIMESTAMP
|
-
|
Числовое значение n**
|
TIMESTAMP, где дни уменьшены на целую часть числа n плюс дробная часть числа n (если указана) как количество десятитысячных долей секунды в дне (8.64x10(^5^))
|
* При необходимости повторяется (result=modulo(result, (24*60*60))) пока не будет выделена результирующая часть дней.
** В диалекте 3 для типа DATE n является целым, представляющим количество дней. Для типов данных TIMESTAMP и для диалекта 1 DATE n может быть числом, представляющим количество дней слева от десятичной точки (целая часть) и части дня справа от десятичной точки (дробная часть). Для типа TIME n является целым числом, представляющим количество секунд.
Общие правила для операций
Одно значение даты или времени может быть вычтено из другого, если:
* оба значения имеют один и тот же тип даты/времени;
* первый операнд является более поздним, чем второй.
Вычитание, использующее типы дата/время, дает результаты: масштабируемое DECIMAL в диалекте 3 и DOUBLE PRECISION В диалекте 1.
Типы данных дата/время не могут складываться друг с другом. Однако можно выполнить конкатенацию части даты и части времени, используя:
* дополнительный бинарный синтаксис для конкатенации пар полей или переменных;
* объединение строк для конкатенации литерала дата/время с другим литералом дата/время или с полем, или переменной типа дата/время.
Операции умножения и деления, включающие типы данных дата/время, недопустимы.
Выражения в качестве операндов
Операндом при увеличении или уменьшении значения TIMESTAMP, TIME, DATE или DATE в диалекте 1 может быть константа или выражение. Выражение может быть особенно полезным в ваших приложениях, когда вам надо увеличить или уменьшить значение в секундах, минутах, часах или, например, требуется половина дня, а не целое количество дней.
Диалект 3 использует правило SQL-92 для деления целого на целое: результатом всегда будет целое, округленное при необходимости в меньшую сторону. При использовании выражений в диалекте 3 убедитесь, что один из операндов является действительным числом с достаточным количеством десятичных знаков, чтобы избежать возможной арифметической ошибки или потери точности результата при выполнении целочисленного деления SQL-92.
В табл. 10.8 показаны некоторые примеры.
Таблица 10.8. Примеры использования выражений в качестве операндов
Вводимый операнд n
|
Сложение или вычитание
|
Альтернатива
|
В секундах
|
n/86400.0
|
(n*1,0)/(60* 60*24)
|
В минутах
|
n/1440.0
|
(n*1.0)/(60*24)
|
В часах
|
n/24.0
|
Зависит от желаемого результата. Например, если n=3, а делитель для половины дня - 2, результат будет 1, а не 1.5
|
Половина дня
|
n/2
|
То же
|
Поскольку годы, месяцы, кварталы не являются константами, нужны более сложные алгоритмы для их использования в операциях даты/времени. Возможно, вам следует для этих целей посмотреть функции, определенные пользователем (UDF), которые вы сможете использовать в качестве выражений в операндах.
Использование CAST() с типами дата/время
В некоторых местах этой главы вы встречали функцию CAST() в выражениях, содержащих типы данных даты и литералы даты. В настоящем разделе рассматриваются различные аспекты преобразования даты и времени более широко и подробно.
Читать дальше