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

Преобразуване на ‘time’ в ‘smalldatetime’ в SQL Server (T-SQL примери)

Тази статия съдържа примери за преобразуване на време стойност до smalldatetime стойност в SQL Server.

Когато преобразувате време стойност на smalldatetime , датата е настроена на „1900-01-01“, а стойностите на часовете и минутите се закръгляват. Секундите и частните секунди са зададени на 0.

Пример 1 – Изрично преобразуване с помощта на CAST()

Ето пример за изрично преобразуване. В този случай използвам CAST() функция директно в SELECT изявление за изрично преобразуване от време до smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Резултат:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Така част от датата се добавя и се задава на „1900-01-01“ и в този случай стойностите на минутите се закръглят нагоре, а секундите се задават на 0.

В документацията на Microsoft се посочва, че частичните секунди също са зададени на нула, но smalldatetime типът данни така или иначе не включва частични секунди.

Между другото, винаги, когато използвате smalldatetime тип данни, компонентът секунди винаги е настроен на 0.

Пример 2 – Закръгляване на часа

Ето пример за закръгления час:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Резултат:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

В този случай посочих и скала от 0 за стойността на времето, но това не се отразява на резултата.

Само за да е ясно, мащаб е броят на цифрите вдясно от десетичната запетая в число. Прецизност е общият брой цифри в числото. Когато посочим мащаб от 0, това означава, че дробната част не е включена.

Пример 3 – Изрично преобразуване с помощта на CONVERT()

Ето пример за използване на CONVERT() функция вместо CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Резултат:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Пример 4 – Неявно преобразуване

Ето пример за правене на същото нещо, но с помощта на имплицитно преобразуване на тип.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

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

Това е имплицитно преобразуване, защото не използваме функция за преобразуване, за да я преобразуваме изрично. Ние просто присвояваме стойността от променлива от един тип данни на променлива от друг тип данни. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да зададем време стойност до smalldatetime променлива.

Пример 5 – Промяна на датата

Ако трябва да промените датата (но запазите същото време), можете да използвате DATEADD() функция.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

В този случай добавям 85 към стойността на годината, което я довежда до 1985.

Имайте предвид обаче, че малка дата поддържа много тесен диапазон от време (1900-01-01 до 2079-06-06), така че добавянето на твърде много към годината може да доведе до грешка при препълване като тази по-долу:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Резултат:

Adding a value to a 'smalldatetime' column caused an overflow.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получаване на дати между диапазон от дати

  2. TSQL:Създайте изглед, който има достъп до множество бази данни

  3. Практичен избор на процесор за SQL Server 2014/2016 OLTP работни натоварвания

  4. Изчисляване на текущото общо с клауза OVER и клауза PARTITION BY в SQL Server

  5. ИЛИ не се поддържа с оператор CASE в SQL Server