Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

DATEDIFF() Примери в SQL Server

В SQL Server можете да използвате T-SQL DATEDIFF() функция за връщане на разликата между две дати/часа. Работи върху всеки израз, който може да бъде разрешен до времедатаsmalldatetimeдата и часдата и час2 или datetimeoffset стойност.

Тази статия предоставя примери за DATEDIFF() функция в SQL Server.

Синтаксис

Първо, ето синтаксиса:

DATEDIFF (част от дата, начална дата, крайна дата)

Където datepart е частта от датата, която искате да сравните. начална дата е първата и крайната дата е крайната дата.

Начинът, по който работи е, че връща броя (като цяло число със знак) на посочения datepart прекосени граници между посочената начална дата и крайна дата .

Пример 1

Ето един основен пример, в който установяваме броя на дните между две дати:

ИЗБЕРЕТЕ DATEDIFF(ден, '2001-01-01', '2002-01-01') КАТО Резултат;

Резултат:

+---------+| Резултат ||----------|| 365 |+---------+

Пример 2

Ето още един пример, в който декларирам две променливи и им присвоявам две различни дати (използвам DATEADD() да добавите 1 година към първата дата). След това използвам DATEDIFF() за да върнете различни части от датата за тази дата:

DECLARE @date1 datetime2 ='2000-01-01 00:00:00.0000000';DECLARE @date2 datetime2 =DATEADD(година, 1, @date1);SELECT DATEDIFF( year, @date1, @date2 ) КАТО Години DATEDIFF( тримесечие, @date1, @date2 ) AS Тримесечия, DATEDIFF( месец, @date1, @date2 ) КАТО месеци, DATEDIFF( седмица, @date1, @date2 ) КАТО седмици, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days;

Резултат:

+--------+------------+----------+--------+-- -----------+-------+| Години | Квартали | Месеци | седмици | Ден на годината | Дни ||--------+------------+---------+--------+--- ----------+--------|| 1 | 4 | 12 | 53 | 366 | 366 |+--------+------------+----------+--------+--- ----------+--------+

Пример 3

Както споменахме, можете също да върнете часовите части между датите. Ето пример за връщане на броя часове, минути и секунди между стойностите за дата/час:

DECLARE @date1 datetime2 ='2000-01-01 00:00:00.0000000';DECLARE @date2 datetime2 =DATEADD(hour, 1, @date1);SELECT DATEDIFF( hour, @date1, @date2 ) КАТО DATEDIFF( минута, @date1, @date2 ) AS минути, DATEDIFF( секунда, @date1, @date2 ) AS секунди;

Резултат:

+--------+-----------+----------+| Часове | Минути | Секунди ||--------+-----------+-----------|| 1 | 60 | 3600 |+---------+-----------+-----------+

Пример 4

И ето пример за получаване на броя на милисекунди, микросекунди и наносекунди между две стойности за дата/час:

DECLARE @date1 datetime2 ='2000-01-01 00:00:00.0000000';DECLARE @date2 datetime2 =DATEADD(милисекунда, 1, @date1);SELECT DATEDIFF( millisecond, @da Milliseconds @date2, AS DATEDIFF( микросекунда, @date1, @date2 ) КАТО микросекунди, DATEDIFF( наносекунди, @date1, @date2 ) КАТО наносекунди;

Резултат:

+----------------+----------------+----------- ---+| Милисекунди | Микросекунди | Наносекунди ||----------------+----------------+------------ --|| 1 | 1000 | 1000000 |+----------------+----------------+------------ --+

Пример 5 – Грешка!

Ако се опитате да направите нещо екстремно, например да върнете броя на наносекунди за 100 години, ще получите грешка. Това е така, защото DATEDIFF() връща int стойност и има повече наносекунди за 100 години отint тип данни може да обработва.

Ето какво се случва, ако се опитате да направите това:

DECLARE @date1 datetime2 ='2000-01-01 00:00:00.0000000';DECLARE @date2 datetime2 =DATEADD(година, 100, @date1);SELECT DATEDIFF( millisecond, @date1, Millisecond, AS @date DATEDIFF( микросекунда, @date1, @date2 ) КАТО микросекунди, DATEDIFF( наносекунди, @date1, @date2 ) КАТО наносекунди;

Резултат:

Функцията datediff доведе до препълване. Броят на частите от дата, разделящи два екземпляра на дата/час, е твърде голям. Опитайте се да използвате datediff с по-малко точна част от датата. 

За щастие, ако наистина трябва да разберете колко наносекунди са за 100 години, можете да използвате DATEDIFF_BIG() функция вместо това. Тази функция връща подписан bigint тип данни, което ви позволява да връщате много по-големи стойности от DATEDIFF() може.

Пример 6 – Получаване на странни резултати?

Резултатите, които получавате от DATEDIFF() понякога може да изглежда напълно погрешно, ако не знаете как всъщност работи функцията.

Например:

DECLARE @startdate datetime2 ='2016-01-01 00:00:00.0000000', @enddate datetime2 ='2016-12-31 23:59:59.9999999';ИЗБЕРЕТЕ @stardatdate (ден, ден, ден) , DATEDIFF(година, @startdate, @enddate) Години;

Резултат:

<пред>+--------+--------+| Дни | Години ||-------+--------|| 365 | 0 |+--------+--------+

Ако не знаете как DATEDIFF() всъщност работи, този резултат може да изглежда толкова погрешен, че ще ви бъде простено да предположите, че това е грешка. Но това не е грешка.

Вижте DATEDIFF() връща грешни резултати в SQL Server? Прочети това. за да видите този пример и други случаи, в които резултатите могат да изглеждат напълно грешни, но да бъдат напълно правилни (и за обяснение защо изглеждат по начина, по който изглеждат).

Един от примерите на тази страница вероятно си струва да се спомене отново тук. DATEDIFF() всъщност игнорира вашия SET DATEFIRST стойност. Това може да доведе до неочаквани резултати, особено ако сте в култура, която не използва неделя като първи ден от седмицата. Вижте това решение за DATEDIFF() Игнориране на SET DATEFIRST в SQL Server, ако смятате, че това може да ви засегне.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да съкратите всички таблици в база данни с помощта на TSQL?

  2. Намерете индекса на последното появяване на подниз с помощта на T-SQL

  3. Разбиране на проблема с мръсното четене със SQL Server

  4. SQL Server SELECT, където всяка колона съдържа 'x'

  5. Поправете съобщение 8116 „Дата на типа данни на аргумента е невалидна за аргумент 1 на функцията под низ“ в SQL Server