В SQL Server можете да използвате T-SQL FORMAT()
функция за форматиране на време тип данни. Ако обаче трябва да добавите обозначението AM/PM, ще трябва да използвате различен тип данни. Това е така, защото навремета Типът данни се основава специално на 24-часов часовник и следователно времето е форматирано като такова.
Пример 1 – Сравняване на ‘time’ с ‘datetime’
Ето пример, за да демонстрирате какво се случва, ако се опитате да форматирате типа данни „време“ с обозначението AM/PM:
ИЗБЕРЕТЕ ФОРМАТ(CAST('11:28:15' КАТО дата и час), 'hh:mm tt') 'datetime', FORMAT(CAST('11:28:15' КАТО време), 'hh\:mm tt') 'време';
Резултат:
+-----------+-------+| дата и час | време ||-----------+--------|| 11:28 сутринта | NULL |+-----------+-------+
Ако се опитате да добавите обозначението AM/PM към стойност „време“, ще получите NULL
.
Следователно, ако трябва да добавите AM или PM към тип данни за време, първо ще трябва да го преобразувате в друг тип данни и след това да го форматирате.
Имайте предвид, че FORMAT()
функцията всъщност връща резултата като низ (освен ако резултатът не е NULL
).
Ако се чудите защо има обратна наклонена черта във втория форматен низ, това се изисква само за време тип данни и се използва за избягване на двоеточие (и всякакви точки). Повече за това тук.
Пример 2 – Преобразуване на ‘time’ в ‘datetime’
Този пример е почти идентичен с предишния пример, с изключение на това, че се опитвам да направя това по-реалистично. В този изрично задавам променлива като тип данни „време“ и след това се опитвам да я форматирам. След това го предавам като „datetime“, преди да го форматирам отново.
DECLARE @thetime time ='11:28:15'ИЗБЕРЕТЕ ФОРМАТ(@thetime, 'hh\:mm tt') 'time', FORMAT(CAST(@thetime като datetime), 'hh:mm tt') 'datetime';
Резултат:
<пред>+--------+-----------+| време | дата и час ||--------+------------|| NULL | 11:28 AM |+--------+-----------+
Ако предпочитате да използвате CONVERT()
функция, ето как би изглеждало това:
DECLARE @thetime time ='11:28:15'ИЗБЕРЕТЕ ФОРМАТ(@thetime, 'hh\:mm tt') 'time', FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';
Резултат:
<пред>+--------+-----------+| време | дата и час ||--------+------------|| NULL | 11:28 AM |+--------+-----------+Или можете просто да присвоите стойността на друга променлива от желания тип:
DECLARE @thetime time ='11:28:15'DECLARE @thedatetime datetime =@thetimeSELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(@thedatetime, 'hh:mm tt' ) 'datetime';
Резултат:
<пред>+--------+-----------+| време | дата и час ||--------+------------|| NULL | 11:28 AM |+--------+-----------+Пример 3 – Единична буква AM/PM обозначение
Можете също да използвате единичен t
за да посочите еднобуквен обозначение AM/PM:
ИЗБЕРЕТЕ ФОРМАТ(CAST('11:28:15' КАТО дата и час), 'hh:mm t') 'AM', FORMAT(CAST('23:28:15' КАТО дата и час), 'hh:mm t ') 'PM';
Резултат:
+--------+--------+| AM | PM ||--------+--------|| 11:28 А | 11:28 P |+---------+--------+
Пример 4 – Без използване на функцията FORMAT()
FORMAT()
функцията беше въведена в SQL Server 2012. Ако използвате по-ранна версия на SQL Server, ще трябва да използвате различен метод, за да добавите обозначението AM/PM. Ето един начин да направите това:
DECLARE @thetime timeSET @thetime ='11:28:15'SELECT CONVERT(varchar(8), @thetime, 100) Резултат;
Резултат:
+---------+| Резултат ||----------|| 11:28 сутринта |+----------+
Като алтернатива можете да използвате replace 100
с 0
за същия резултат:
DECLARE @thetime timeSET @thetime ='11:28:15'SELECT CONVERT(varchar(8), @thetime, 0) Резултат;
Резултат:
+---------+| Резултат ||----------|| 11:28 сутринта |+----------+