sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo agregar AM/PM a un valor de tiempo en SQL Server (T-SQL)

En SQL Server, puede usar T-SQL FORMAT() función para dar formato a una hora tipo de datos. Sin embargo, si necesita agregar el designador AM/PM, deberá usar un tipo de datos diferente. Esto se debe a que el tiempo el tipo de datos se basa específicamente en un reloj de 24 horas y, por lo tanto, la hora se formatea como tal.

Ejemplo 1:comparar 'hora' con 'fechahora'

Aquí hay un ejemplo para demostrar lo que sucede si intenta formatear el tipo de datos de "hora" con el designador AM/PM:

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

Resultado:

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

Si intenta agregar el designador AM/PM a un valor de "hora", obtendrá NULL .

Por lo tanto, si necesita agregar AM o PM a un tipo de datos de tiempo, primero deberá convertirlo a otro tipo de datos y luego formatearlo.

Tenga en cuenta que el FORMAT() la función en realidad devuelve el resultado como una cadena de todos modos (a menos que el resultado sea NULL ).

Si se pregunta por qué hay una barra invertida en la segunda cadena de formato, solo es necesaria para la hora. tipo de datos, y se utiliza para escapar de los dos puntos (y cualquier punto). Más sobre eso aquí.

Ejemplo 2:convertir 'hora' en 'fechahora'

Este ejemplo es casi idéntico al ejemplo anterior, excepto que trato de hacerlo más realista. En este, configuro explícitamente una variable como un tipo de datos de "tiempo" y luego trato de formatear eso. Luego lo emito como 'fecha y hora' antes de volver a formatearlo.

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

Resultado:

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

Si prefiere usar CONVERT() función, así es como se vería:

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

Resultado:

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

O simplemente podría reasignar el valor a otra variable del tipo deseado:

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

Resultado:

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

Ejemplo 3:Designador AM/PM de una sola letra

También puedes usar una sola t para especificar un designador AM/PM de una sola letra:

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

Resultado:

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

Ejemplo 4:sin utilizar la función FORMAT()

El FORMAT() La función se introdujo en SQL Server 2012. Si usa una versión anterior de SQL Server, deberá usar un método diferente para agregar el designador AM/PM. Esta es una manera de hacerlo:

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

Resultado:

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

Alternativamente, puede usar replace 100 con 0 para el mismo resultado:

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

Resultado:

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