Trabajando con fechas en SQL Server

Manejando Fechas en SQL Server

Las funciones de fecha y hora de SQL Server permiten manejar y hacer los cálculos usando campos de tipo Fecha y de tipo Hora, es posible que para efectos de algún proceso se tengan que calcular la cantidad de años, meses o días que existen entre dos fechas determinadas. En este artículo se explica como manejar los datos de tipos fecha para realizar estos cálculos.

Para más información ver:
Funciones de fecha y hora
Listado usando Select

Usando la base de datos Northwind

use Northwind
go

Ejercicio 1

Calculando edades, la cantidad de años, meses y días de un empleado. Note que para la cantidad de años se ha calculado la diferencia de días desde la fecha de nacimiento hasta la fecha actual y dividido entre 365.25 (cantidad exacta de días en el año.)

Set dateformat dmy
go
select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) As ‘Años’,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) *12
As ‘Meses’,
Floor(
Cast(DATEDIFF(dd,E.BirthDate, GetDate()) As Numeric(9,2))
– DATEDIFF(dd,E.BirthDate,DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate) )
– Datediff(dd,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate),
DateAdd
(mm,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) *12,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate)
)
)
)
As ‘Días’
from Employees As E
go
El resultado se muestra en la siguiente imagen (fecha de captura de la imagen 28/12/2020)

Años, meses y días exactos al 28 de diciembre de 2020

Ejercicio 2

Mostrar el cumpleaños del año actual

select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
Format(
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate)
, ‘dd/MM/yyyy’)
As ‘Cumpleaño año actual’
from Employees As E
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)

Ejercicio 3

En este ejercicio se muestra la fecha de nacimiento, el día del cumpleaños del año actual, los meses transcurridos después del cumpleaños del año actual, la fecha del último mes cumplido y los días transcurridos desde el último mes cumplido.
select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
Format(DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate,
GetDate())/365.25 As Numeric(9,2))),E.BirthDate),’dd/MM/yyyy’) ‘Cumple año actual’,
— Meses transcurridos
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) *12
As ‘Meses’,
Format(
DateAdd(mm,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) *12,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate))
,’dd/MM/yyyy’)
As ‘Último mes cumplido’
,
Datediff
(dd,
DateAdd(mm,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) *12,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))),E.BirthDate))
,
GetDate()
)
As ‘Días desde el último mes cumplido’
from Employees As E
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)

Ejercicio 4

Mostrar la cantidad de años, meses y días en el trabajo.
select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.HireDate, ‘dd/MM/yyyy’) As ‘Fecha de contrato’,
Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))) As ‘Años’,
Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))) *12
As ‘Meses’,
Floor(
Cast(DATEDIFF(dd,E.HireDate, GetDate()) As Numeric(9,2))
– DATEDIFF(dd,E.HireDate,DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))),E.HireDate) )
– Datediff(dd,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))),E.HireDate),
DateAdd
(mm,
Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))*12) –
Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))) *12,
DATEADD(yy,Floor(Cast(DATEDIFF(dd,E.HireDate, GetDate())/365.25 As Numeric(9,2))),E.HireDate)
)
)
)
As ‘Días’
from Employees As E
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)

Ejercicio 5

Mostrar las órdenes y la cantidad de días en ser atendidas.
select
O.OrderID As ‘Nº Orden’, C.CompanyName As ‘Cliente’,
Format(O.OrderDate,’dd/MM/yyyy’) As ‘Fecha Registro’,
Format(O.ShippedDate,’dd/MM/yyyy’) As ‘Fecha atención’,
DATEDIFF(dd,O.OrderDate, O.ShippedDate) As ‘Días de demora’
from Orders As O
join Customers As C on O.CustomerID = C.CustomerID
where O.ShippedDate is not null
Order by [Días de demora] desc
go
El resultado se muestra en la siguiente imagen

Ejercicio 6

Listado de cumpleaños del mes.
select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
Day(E.BirthDate) As ‘Día’
from Employees As E
where MONTH(E.BirthDate) = MONTH(GetDate())
order by Día
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)

Ejercicio 7

Años de los empleados, ordenados de menor a mayor
select
E.LastName + space(1) + E.FirstName As ‘Empleado’,
Format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) As ‘Años’
from Employees As E
order by 3
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)

Función GetUTCDate

La función GetUTCDate muestra la hora de acuerdo al Meridiano de Greenwich, que es el meridiano a partir del cual se miden las longitudes. El equipo donde se ha ejecutado las instrucciones se encuentra ubicado en la zona horaria (UTC-05:00) Bogotá, Lima, Quito, Rio Branco.

La instrucción siguiente muestra la fecha actual usando GetDate, el resultado de GetUTCDate y la fecha actual sumándole las 5 horas de diferencia según la zona horaria de Perú, que es la configuración del equipo desde donde se publican los artículos de esta página.

Select GETDATE() As ‘Fecha actual’,
GETUTCDATE() As ‘Fecha UTC’,
DateAdd(hh,5,GetDate()) As ‘Fecha actual mas 5 horas’
go
El resultado se muestra en la siguiente imagen. (fecha de captura de la imagen 28/12/2020)