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

DATEDIFF() срещу DATEDIFF_BIG() в SQL Server:Каква е разликата?

Ако някога сте имали нужда да намерите разликата между две дати в SQL Server, може да сте използвали DATEDIFF() функция. Тази функция връща времето между две дати с помощта на datepart посочени от вас. Например, можете да го използвате, за да върнете броя на дните между дата 1 и дата 2. Можете също да го накарате да връща броя минути, секунди, месеци, години и т.н.

DATEDIFF_BIG() функцията работи точно по същия начин, но с една фина разлика:нейният тип данни за връщане.

Така че разликата между тези две функции е типът данни на тяхната връщана стойност.

  • DATEDIFF() връща цяло число със знак (int )
  • DATEDIFF_BIG() връща голямо цяло число със знак (bigint )

В някои случаи няма да имате много нужда да връщате bigint тип данни. Това представлява много голямо число и дали използвате DATEDIFF() или DATEDIFF_BIG() няма да има разлика (с изключение на изискванията за съхранение – int използва 4 байта, големи използва 8 байта).

Ако обаче срещнете следната грешка:

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

Това е, защото връщаната стойност е твърде голяма.

В този случай ще трябва да направите едно от трите неща:

  • Използвайте по-кратък период от време. Например, вместо да се опитвате да върнете броя на милисекунди за 26 дни, опитайте 25.
  • Използвайте по-малко точна част от дата . Например, вместо да се опитвате да върнете броя на милисекунди, опитайте само с секунди.
  • Използвайте DATEDIFF_BIG() функция вместо това.

Понякога първите две опции не са подходящи. Ако имате нужда от времеви интервал от 26 дни, 25 няма да го съкрати. И ако имате нужда от времева марка на Unix след 2038 г., ще срещнете проблеми 2038, ако използвате DATEDIFF() .

Във всеки случай, DATEDIFF_BIG() функцията позволява много по-голям обхват от резултати от DATEDIFF() .

Пример

Ето два примера за демонстриране както на приликите, така и на разликите между DATEDIFF() и DATEDIFF_BIG() .

Същият резултат

Ето пример, при който и двете функции дават един и същ резултат:

DECLARE @date1 datetime2 =SYSDATETIME(); ДЕКЛАРИРАНЕ @date2 datetime2 =DATEADD(second, 1, SYSDATETIME());SELECT DATEDIFF( милисекунда, @date1, @date2 ) КАТО DATEDIFF, DATEDIFF_BIG( милисекунда, @date1, @date2 ) КАТО DATEDIFF>_BIG; 

Резултат:

DATEDIFF DATEDIFF_BIG-------- ------------1000 1000 

Както се очаква, и двете функции връщат един и същ резултат. Това е така, защото връщаната стойност е достатъчно малка, за да обслужи и двете големи ивх типове данни. Всичко, което направихме, беше да върнем броя на милисекунди за 1 секунда.

Различен резултат

Ето какво ще се случи, ако увеличим времевата рамка до 1000 години.

Първо, ето какво се случва, когато използваме DATEDIFF() :

DECLARE @date1 datetime2 =SYSDATETIME();DECLARE @date2 datetime2 =DATEADD(година, 1000, SYSDATETIME());SELECT DATEDIFF( милисекунда, @date1, @date2 ) КАТО DATEDIFF;

Резултат:

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

Сега, ето как DATEDIFF_BIG() се справя с това:

DECLARE @date1 datetime2 =SYSDATETIME();DECLARE @date2 datetime2 =DATEADD(година, 1000, SYSDATETIME());SELECT DATEDIFF_BIG( милисекунда, @date1, @date2 ) КАТО DATEDIFF_BIG;

Резултат:

DATEDIFF_BIG --------------31556908800000

Връщането на броя на милисекунди за 1000 години беше твърде много за int , но това не е проблем за големи .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Импортирайте колони на електронни таблици на Excel в базата данни на SQL Server

  2. Добавяне на множество параметризирани променливи към база данни в C#

  3. 2 начина за създаване на база данни на свързан сървър с помощта на T-SQL

  4. SQL - Разлика между COALESCE и ISNULL?

  5. Направете, а не нарушавайте производителността на SQL Server