sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man lägger till AM/PM till ett tidsvärde i SQL Server (T-SQL)

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  |
+----------+

  1. The Eager Index Spool och The Optimizer

  2. EM SQL Monitor Impact

  3. Fråga extremt långsam i koden men snabb i SSMS

  4. Anslut till fjärr MySQL-databas via SSH med Java