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

datetime срещу smalldatetime в SQL Server:Каква е разликата?

Тази статия изследва основните разлики между дата и час и smalldatetime типове данни в SQL Server.

И двата типа данни се използват за съхранение на стойности за дата и час, но има разлики между двете. В повечето случаи е по-добре да избягвате и двата типа и да използвате datetime2 вместо това (Microsoft също препоръчва това). Във всеки случай, ето сравнение на тези два типа данни.

Следващата таблица очертава някои ключови прилики и разлики между тези два типа данни.

Функция smalldatetime дата и час
Съвместим с SQL (ANSI и ISO 8601) Не Не
Период от време 1900-01-01 до 2079-06-06 1753-01-01 до 9999-12-31
Диапазон от време 00:00:00 до 23:59:59 00:00:00 до 23:59:59,997
Дължина на знака Максимум 19 позиции 19 позиции минимум
23 максимум
Размер на съхранение 4 байта, фиксирани 8 байта, фиксирани
Точност Една минута Закръглено до стъпки от .000, .003 или .007 секунди
Дробна секундна точност Не Да
Дефинирана от потребителя точност на дробна секунда Не Не
Изместване на часовата зона Няма Няма
Осведомяване и запазване на изместването на часовата зона Не Не
Наясно с лятното часово време Не Не

Трябва ли да използвам „datetime“ или „smalldatetime“?

Microsoft препоръчва да не се използват и двата типа данни за нова работа. Трябва да ги използвате само ако имате сериозни причини за това.

Но ако трябва да избирате, решението ви вероятно ще бъде взето чрез претегляне на допълнителната прецизност и точност на datetime спрямо по-ниските изисквания за съхранение на smalldatetime .

С други думи, ако не се нуждаете от точност до секунди, smalldatetime ще свърши работа, като използва само половината място за съхранение. От друга страна, ако имате нужда от точност до секундите (или дори частични секунди), тогава ще трябва да използвате datetime .

Във всеки случай Microsoft препоръчва използването на дата ,време , дата и час2 , или datetimeoffset за нова работа.

Вижте smalldatetime срещу datetime2 и дата и час срещу datetime2 за да видите как всеки от тези типове се сравнява с datetime2 .

Пример 1 – Основно сравнение

Ето един бърз пример, за да демонстрирате основната разлика между дата и час и smalldatetime .

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.555';
SET @thesmalldatetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Тук зададох малка дата променлива на същата стойност като datetime променлива. Това кара стойността да се преобразува в smalldatetime и след това можем да използваме SELECT оператор, за да видите действителната стойност, която е присвоена на всяка променлива.

В този случай и двете променливи закръглят стойността. Но те се закръглят по различен начин.

Дата и час променливата закръглява частта с частични секунди. Това е така, защото дата и час винаги закръглява до стъпки от .000, .003 или .007 секунди.

Smalldatetime променливата от друга страна, закръглява минутите част. Не само това, частта за секундите е настроена на нула. Това може да се очаква, тъй като в официалната документация на Microsoft се посочва, че smalldatetime Времето на ‘s е ...базирано на 24-часов ден, със секунди винаги нула (:00) и без частични секунди .

Така че можем да видим, че datetime type предоставя по-точна и точна стойност за дата/час.

Пример 2 – Задаване на стойности от низови литерали

В предишните примери, smalldateime стойността беше присвоена чрез задаване на същата стойност като datetime стойност. Когато направим това, SQL Server извършва имплицитно преобразуване, за да могат данните да „прилягат“ на новия тип данни.

Както се оказва, можем да зададем и smalldatetime променлива към същия низов литерал, който включва дробни секунди (въпреки че този тип данни не съхранява дробни секунди).

Ето пример, когато правя точно това:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.555';
SET @thesmalldatetime = '2025-05-21 10:15:30.555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Разбира се, резултатът е същият, когато изберем стойностите – smalldatetime стойността не показва дробни секунди, секундите са нула, а минутите се закръглят нагоре.

Ако обаче използваме повече от 3 знака след десетичната запетая, тогава и двата типа данни ще върнат грешка.

Грешка за дата и час :

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.5555';
SET @thesmalldatetime = '2025-05-21 10:15:30.5555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.

Грешка за smalldatetime :

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.5555';
SET @thesmalldatetime = '2025-05-21 10:15:30.5555';
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

Msg 295, Level 16, State 3, Line 5
Conversion failed when converting character string to smalldatetime data type.

Пример 3 – Размер за съхранение

Smalldatetime типът данни има фиксиран размер на съхранение от 4 байта. Това е едно от малкото предимства smalldatetime има над дата и час , който има фиксиран размер за съхранение от 8 байта.

Можем да проверим размера на съхранение с помощта на DATALENGTH() функция за връщане на броя байтове, използвани за всяка от нашите стойности:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  DATALENGTH(@thedatetime) AS 'datetime',
  DATALENGTH(@thesmalldatetime) AS 'smalldatetime';

Резултат

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+

Също така получаваме същия резултат, дори ако ги преобразуваме в varbinary , което е по-представително за това как всъщност се съхраняват в базата данни:

DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime',
  DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';

Резултат

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ИЗБЕРЕТЕ ЗА АКТУАЛИЗИРАНЕ със SQL Server

  2. SQL заявка за актуализация на горния 1 ред

  3. Какво представлява типът данни SYSNAME в SQL Server?

  4. Как да върнете само датата от тип данни на SQL Server DateTime

  5. Какво представлява системата за управление на база данни и релационни бази данни (RDBMS)