loading..
Русский    English
13:16
листать

Функция DATEDIFF стр. 1

Синтаксис:

  1. DATEDIFF(datepart, startdate, enddate)

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

Пример 7.1.2

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

Консоль
Выполнить
  1. SELECT DATEDIFF(dd, (SELECT MIN(date)
  2. FROM pass_in_trip
  3. ),
  4. (SELECT MAX(date)
  5. FROM pass_in_trip
  6. )
  7. );

Пример 7.1.3

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

Здесь следует принять во внимание, что время вылета (time_out) и время прилета (time_in) хранится в полях типа datetime таблицы Trip. Как уже отмечалось,  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server вплоть до версии 2005 не имел отдельных темпоральных типов данных для даты и времени. Поэтому при вставке в поле datetime только времени (например, UPDATE trip SET time_out = ’17:24:00’ WHERE trip_no = 1123), время будет дополнено значением даты по умолчанию (1900-01-01), являющейся начальной точкой отсчета времени.

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

Консоль
Выполнить
  1. SELECT DATEDIFF(mi, time_out, time_in) dur
  2. FROM trip
  3. WHERE trip_no = 1123;
(которое дает 760 минут) будет неверным по двум причинам.

Во-первых, для рейсов, которые вылетают в один день, а прилетают на следующий, вычисленное таким способом значение будет неправильным;

Во-вторых, ненадежно делать какие либо предположения относительно дня, который присутствует только в силу необходимости соответствовать типу datetime.

Но как определить, что самолет приземлился на следующий день? Тут помогает описание предметной области, где говорится, что полет не может продолжаться более суток. Итак, если время прилета не больше, чем время вылета, то этот факт имеет место.

Теперь второй вопрос: как посчитать только время, с каким бы днем оно ни стояло?

Здесь может помочь функция  T-SQL (Transact-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE.T-SQL DATEPART, речь о которой пойдет в следующем пункте.

Следует иметь в виду одну особенность использования функции DATEDIFF. Начнем с примеров. Сначала посчитаем число недель с воскресенья 23-10-2005 до субботы 29-10-2005. Итак,

Консоль
Выполнить
  1. SELECT DATEDIFF(wk, '20051023', '20051029');

Здравый смысл подсказывает, что это полная неделя, однако, вышеприведенный запрос дает 0. Теперь возьмем интервал с субботы 29-10-2005 до воскресенья 30-10-2005:

Консоль
Выполнить
  1. SELECT DATEDIFF(wk, '20051029', '20051030');

В результате получим 1, то есть одну неделю. Пора дать объяснения. Дело в том, что функция DATEDIFF фактически считает неделей не число дней, а число переходов с субботы на воскресенье. Если это иметь в виду, то тогда становится понятным еще более удивительный пример:

Консоль
Выполнить
  1. SELECT DATEDIFF(wk, '20051029 23:59:00', '20051030 00:01:00');
который тоже дает единицу!

Странно? Возможно, но, как говорится, кто предупрежден, тот вооружен. То же самое имеет место и для других интервалов. Например, количество дней дает нам не число часов, деленное нацело на 24 (количество часов в сутках), а число переходов через полночь. Хотите подтверждения? Пожалуйста

Консоль
Выполнить
  1. SELECT DATEDIFF(dd, '20051029 23:59:00', '20051030 00:01:00');

В результате получаем один день, в то же время

Консоль
Выполнить
  1. SELECT DATEDIFF(dd, '20051029 00:00:00', '20051029 23:59:59');
дает нам 0.

Если хотите, можете продолжить эксперименты с другими временными интервалами. Вы можете воспользоваться для этого предоставляемой Консолью.

Рекомендуемые упражнения: 76, 93

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100