sql >> Database >  >> RDS >> Sqlserver

AM/PM toevoegen aan een tijdwaarde in SQL Server (T-SQL)

In SQL Server kunt u de T-SQL FORMAT() . gebruiken functie om een ​​tijd te formatteren data type. Als u echter de AM/PM-aanduiding moet toevoegen, moet u een ander gegevenstype gebruiken. Dit komt omdat de tijd gegevenstype is specifiek gebaseerd op een 24-uurs klok, en daarom is de tijd als zodanig geformatteerd.

Voorbeeld 1 – Vergelijk ‘tijd’ met ‘datetime’

Hier is een voorbeeld om te laten zien wat er gebeurt als u het gegevenstype 'tijd' probeert op te maken met de AM/PM-aanduiding:

SELECT 
  FORMAT(CAST('11:28:15' AS datetime), 'hh:mm tt') 'datetime',
  FORMAT(CAST('11:28:15' AS time), 'hh\:mm tt') 'time';

Resultaat:

+------------+--------+
| datetime   | time   |
|------------+--------|
| 11:28 AM   | NULL   |
+------------+--------+

Als u de AM/PM-aanduiding probeert toe te voegen aan een 'tijd'-waarde, krijgt u NULL .

Als u daarom AM of PM aan een tijdgegevenstype moet toevoegen, moet u dit eerst naar een ander gegevenstype converteren en vervolgens formatteren.

Merk op dat de FORMAT() functie retourneert het resultaat eigenlijk sowieso als een tekenreeks (tenzij het resultaat NULL is) ).

Als je je afvraagt ​​waarom er een backslash in de tekenreeks van het tweede formaat staat, is dit alleen nodig voor de tijd gegevenstype, en het wordt gebruikt om te ontsnappen aan de dubbele punt (en eventuele punten). Meer daarover hier.

Voorbeeld 2 – Omzetten van 'tijd' naar 'datetime'

Dit voorbeeld is bijna identiek aan het vorige voorbeeld, behalve dat ik dit realistischer probeer te maken. In deze heb ik expliciet een variabele ingesteld als een 'tijd'-gegevenstype en probeer dat vervolgens te formatteren. Ik cast het vervolgens als 'datetime' voordat ik het opnieuw formatteer.

DECLARE @thetime time = '11:28:15'
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(CAST(@thetime AS datetime), 'hh:mm tt') 'datetime';

Resultaat:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Als u liever de CONVERT() . gebruikt functie, zo zou dat eruit zien:

DECLARE @thetime time = '11:28:15'
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';

Resultaat:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Of u kunt de waarde gewoon opnieuw toewijzen aan een andere variabele van het gewenste type:

DECLARE @thetime time = '11:28:15'
DECLARE @thedatetime datetime = @thetime
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(@thedatetime, 'hh:mm tt') 'datetime';

Resultaat:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Voorbeeld 3 – Enkele letter AM/PM-aanduiding

U kunt ook een enkele t . gebruiken om een ​​AM/PM-aanduiding met één letter op te geven:

SELECT 
  FORMAT(CAST('11:28:15' AS datetime), 'hh:mm t') 'AM',
  FORMAT(CAST('23:28:15' AS datetime), 'hh:mm t') 'PM';

Resultaat:

+---------+---------+
| AM      | PM      |
|---------+---------|
| 11:28 A | 11:28 P |
+---------+---------+

Voorbeeld 4 – Zonder de functie FORMAT() te gebruiken

De FORMAT() functie is geïntroduceerd in SQL Server 2012. Als u een eerdere versie van SQL Server gebruikt, moet u een andere methode gebruiken om de AM/PM-aanduiding toe te voegen. Hier is een manier om dat te doen:

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

Resultaat:

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

Als alternatief kunt u vervangen 100 . gebruiken met 0 voor hetzelfde resultaat:

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

Resultaat:

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

  1. Gegevenstype Oracle JDBC en Oracle CHAR

  2. SELECT roept uitzondering op in PL/pgSQL-functie

  3. Wat is het verschil tussen de functies RANK() en DENSE_RANK() in Oracle?

  4. Een tekenreeks converteren naar een datum/tijd in SQL Server met CONVERT()