I SQL Server kan du använda T-SQL FORMAT()
funktion för att formatera en tid data typ. Men om du behöver lägga till AM/PM-designatorn måste du använda en annan datatyp. Detta beror på att tiden datatypen är specifikt baserad på en 24-timmarsklocka, och därför är tiden formaterad som sådan.
Exempel 1 – Jämföra 'tid' med 'datumtid'
Här är ett exempel för att visa vad som händer om du försöker formatera datatypen "tid" med AM/PM-designatorn:
SELECT FORMAT(CAST('11:28:15' AS datetime), 'hh:mm tt') 'datetime', FORMAT(CAST('11:28:15' AS time), 'hh\:mm tt') 'time';
Resultat:
+------------+--------+ | datetime | time | |------------+--------| | 11:28 AM | NULL | +------------+--------+
Om du försöker lägga till AM/PM-beteckningen till ett "tid"-värde får du NULL
.
Därför, om du behöver lägga till AM eller PM till en tidsdatatyp, måste du först konvertera den till en annan datatyp och sedan formatera den.
Observera att FORMAT()
funktion returnerar faktiskt resultatet som en sträng ändå (om inte resultatet är NULL
).
Om du undrar varför det finns ett snedstreck i den andra formatsträngen, krävs detta bara under tiden datatyp, och den används för att undvika kolon (och eventuella punkter). Mer om det här.
Exempel 2 – Konvertering av "tid" till "datumtid"
Det här exemplet är nästan identiskt med det tidigare exemplet, förutom att jag försöker göra detta mer realistiskt. I den här ställer jag uttryckligen in en variabel som en "tid" datatyp och försöker sedan formatera den. Jag castade det sedan som "datetime" innan jag formaterade det igen.
DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CAST(@thetime AS datetime), 'hh:mm tt') 'datetime';
Resultat:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Om du föredrar att använda CONVERT()
funktion, så här skulle det se ut:
DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';
Resultat:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Eller så kan du bara tilldela värdet till en annan variabel av önskad typ:
DECLARE @thetime time = '11:28:15' DECLARE @thedatetime datetime = @thetime SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(@thedatetime, 'hh:mm tt') 'datetime';
Resultat:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Exempel 3 – Enkelbokstav AM/PM-beteckning
Du kan också använda en enda t
för att ange en enkelbokstavs AM/PM-beteckning:
SELECT FORMAT(CAST('11:28:15' AS datetime), 'hh:mm t') 'AM', FORMAT(CAST('23:28:15' AS datetime), 'hh:mm t') 'PM';
Resultat:
+---------+---------+ | AM | PM | |---------+---------| | 11:28 A | 11:28 P | +---------+---------+
Exempel 4 – Utan att använda FORMAT()-funktionen
FORMAT()
funktion introducerades i SQL Server 2012. Om du använder en tidigare version av SQL Server måste du använda en annan metod för att lägga till AM/PM-designatorn. Här är ett sätt du kan göra det:
DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 100) Result;
Resultat:
+----------+ | Result | |----------| | 11:28AM | +----------+
Alternativt kan du använda ersätt 100
med 0
för samma resultat:
DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 0) Result;
Resultat:
+----------+ | Result | |----------| | 11:28AM | +----------+