Справка по SQL | страница 21



yy, yyyy

Quarter - квартал

qq, q

Month - месяц

mm, m

Dayofyear - день года

dy, y

Day - день

dd, d

Week - неделя

wk, ww

Hour - час

hh

Minute - минута

mi, n

Second - секунда

ss, s

Millisecond - миллисекунда

ms


Пусть сегодня 23/01/2004, и мы хотим узнать, какой день будет через неделю. Мы можем написать


>SELECT DATEADD(day, 7, current_timestamp)


а можем и так


>SELECT DATEADD(ww, 1, current_timestamp)


В результате получим одно и то же; что-то типа 2004-01-30 19:40:58.923.

Однако мы не можем в этом случае написать


>SELECT DATEADD(mm, 1/4, current_timestamp)


потому, что дробная часть значения аргумента datepart отбрасывается, и мы получим 0 вместо одной четвертой и, как следствие, текущий день.

Кроме того, мы можем использовать вместо CURRENT_TIMESTAMP функцию T-SQL GETDATE() с тем же самым эффектом. Наличие двух идентичных функций поддерживается, видимо, в ожидании последующего развития стандарта.

Пример (схема 4). Определить, какой будет день через неделю после последнего полета.


>SELECT DATEADD(day, 7, (SELECT MAX(date) max_date FROM pass_in_trip))


Использование подзапроса в качестве аргумента допустимо, т.к. этот подзапрос возвращает ЕДИНСТВЕННОЕ значение типа datetime.

Функция DATEDIFF


Синтаксис

DATEDIFF ( datepart , startdate , enddate )

Функция возвращает интервал времени, прошедшего между двумя временными отметками - startdate (начальная отметка) и enddate (конечная отметка). Этот интервал может быть измерен в разных единицах. Возможные варианты определяются аргументом datepart и перечислены выше применительно к функции DATEADD.

Пример (схема 4). Определить количество дней, прошедших между первым и последним совершенными рейсами.


>SELECT DATEDIFF(dd, (SELECT MIN(date) FROM pass_in_trip), (SELECT MAX(date) FROM pass_in_trip))


Пример (схема 4). Определить продолжительность рейса 1123 в минутах.

Здесь следует принять во внимание, что время вылета (time_out) и время прилета (time_in) хранится в полях типа datetime таблицы Trip. Заметим, что SQL Server вплоть до версии 2000 не имеет отдельных темпоральных типов данных для даты и времени, появление которых ожидается в следующей версии (Yukon). Поэтому при вставке в поле datetime только времени (например, UPDATE trip SET time_out = '17:24:00' WHERE trip_no=1123), время будет дополнено значением даты по умолчанию ('1900-01-01').

Напрашивающееся решение


>SELECT DATEDIFF(mi, time_out, time_in) dur FROM trip WHERE trip_no=1123,


(которое дает -760) будет неверным по двум причинам.