sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan tilføjes AM/PM til en tidsværdi i SQL Server (T-SQL)

I SQL Server kan du bruge T-SQL FORMAT() funktion til at formatere et tidspunkt datatype. Men hvis du skal tilføje AM/PM-designatoren, skal du bruge en anden datatype. Dette skyldes, at tiden datatypen er specifikt baseret på et 24-timers ur, og klokkeslættet er derfor formateret som sådan.

Eksempel 1 – Sammenligning af ‘tid’ med ‘datetime’

Her er et eksempel for at demonstrere, hvad der sker, hvis du forsøger at formatere 'tid'-datatypen med AM/PM-designatoren:

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

Hvis du forsøger at tilføje AM/PM-betegnelsen til en 'tidsværdi', får du NULL .

Derfor, hvis du har brug for at tilføje AM eller PM til en tidsdatatype, skal du først konvertere den til en anden datatype og derefter formatere den.

Bemærk, at FORMAT() funktion returnerer faktisk resultatet som en streng alligevel (medmindre resultatet er NULL ).

Hvis du undrer dig over, hvorfor der er en omvendt skråstreg i den anden formatstreng, er dette kun påkrævet i tiden datatype, og den bruges til at undslippe kolon (og eventuelle punktum). Mere om det her.

Eksempel 2 – Konvertering af 'tid' til 'datotid'

Dette eksempel er næsten identisk med det forrige eksempel, bortset fra at jeg forsøger at gøre dette mere realistisk. I denne indstillede jeg eksplicit en variabel som en 'tid' datatype og forsøger derefter at formatere den. Jeg castede det derefter som 'datetime', før jeg formaterede 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   |
+--------+------------+

Hvis du foretrækker at bruge CONVERT() funktion, sådan vil det se ud:

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 du kan bare gentildele værdien til en anden variabel af den ønskede type:

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

Eksempel 3 – Enkeltbogstav AM/PM-betegnelse

Du kan også bruge en enkelt t for at angive et enkelt bogstav AM/PM-betegnelse:

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

Eksempel 4 – Uden at bruge FORMAT()-funktionen

FORMAT() funktion blev introduceret i SQL Server 2012. Hvis du bruger en tidligere version af SQL Server, skal du bruge en anden metode til at tilføje AM/PM-designatoren. Her er en måde du kan gøre det på:

DECLARE @thetime time
SET @thetime = '11:28:15'
SELECT CONVERT(varchar(8), @thetime, 100) Result;

Resultat:

+----------+
| Result   |
|----------|
| 11:28AM  |
+----------+

Alternativt kan du bruge erstatte 100 med 0 for samme resultat:

DECLARE @thetime time
SET @thetime = '11:28:15'
SELECT CONVERT(varchar(8), @thetime, 0) Result;

Resultat:

+----------+
| Result   |
|----------|
| 11:28AM  |
+----------+

  1. Forespørg om sammenligning af datoer i SQL

  2. kommasepareret liste som en enkelt streng, T-SQL

  3. Opdeling af afgrænsede værdier i en SQL-kolonne i flere rækker

  4. Ti tips til at gå i produktion med PostgreSQL