
Fechas en SQL Server, filtros y campos calculados
El manejo correcto de fechas es importante en cualquier programa, en SQL Server existen funciones de fecha nos ayudan a la extracción de datos usando filtros con campos de tipo fecha y también construyendo campos calculados con ellos.
Para mas información ver:
Funciones de fecha y hora
Trabajando con fechas
Definiendo el formato de fechas
El formato de como se escriben las fechas se puede establecer usando la instrucción Set DateFormat, en la siguiente
lista se muestran los formatos posibles, donde d es el día, m es el mes y y es el año.
mdy Mes/Día/Año
dmy Dia/Mes/Año
ymd Año/Mes/Día
ydm Año/Día/Mes
myd Mes/Año/Día
dym Día/Año/Mes
Para formatear la fecha en Día/Mes/Año se usa la instrucción siguiente
set dateformat dmy
go
En este artículo presentamos ejercicios mostrando las fechas en diferentes formatos además de usar campos
calculados con fechas para filtros.
Usando la base de datos Northwind
use Northwind
go
Ejercicio 1
Presentar la fecha de nacimiento como Mes Dia, Año por ejemplo el 23 de julio de 1966 se muestra Jul 23, 1966
select
Concat_ws(Space(1),E.TitleOfCourtesy,E.FirstName,E.LastName) As ‘Empleado’,
Upper(Substring(FORMAT(E.BirthDate,’dd/MMM/yyyy’),4,1))+
Substring(FORMAT(E.BirthDate,’dd/MMM/yyyy’),5,2)+ SPACE(1) +
Trim(Str(DAY(E.BirthDate))) + ‘, ‘+trim(Str(YEAR(E.BirthDate)))
As ‘Fecha de nacimiento’
from dbo.Employees As E
go
La imagen muestra el resultado

Ejercicio 2
Presentar la fecha larga como «Sábado 23 de Julio de 1966»
select
Concat_ws(Space(1),E.TitleOfCourtesy,E.FirstName,E.LastName) As ‘Empleado’,
DATENAME(DW,E.BirthDate) + Space(1) +
Trim(Str(DAY(E.BirthDate))) + ‘ de ‘+
DATENAME(MONTH,E.BirthDate) + ‘ de ‘ +
trim(Str(YEAR(E.BirthDate)))
As ‘Fecha de nacimiento’
from dbo.Employees As E
go
La imagen muestra el resultado

Filtrando por fechas
Para filtrar por campos tipo fecha se debe siempre hacer el análisis de la forma mas óptima de construir la expresión de filtro, puede usarse funciones de fecha o usando operadores, utilice el Plan de ejecución estimado para ver la mejor opción.
Ejercicio 3
Listar las órdenes entre los meses de Agosto a Noviembre de 1997
select
O.OrderID,
O.OrderDate,
O.Freight
from dbo.Orders As O
where year(O.OrderDate) = 1997 and Month(O.OrderDate) in (8,9,10,11)
go
La imagen muestra el resultado

El plan de ejecución muestra un costo de 0.0198336

Al usar un rango de fechas
select
O.OrderID,
O.OrderDate,
O.Freight
from dbo.Orders As O
where O.OrderDate between ’01/08/1997′ and ’30/11/1997′
go

El plan de ejecución muestra un costo de 0.0197506, comparado con el uso de las funciones cuyo valor
según el plan de ejecución estimado es 0.0198336 se puede concluir que es conveniente el uso del operador between.
Formateando datos tipo fecha
Para el formato de fechas usamos la función format, esta funciona con los caracteres siguientes: «d» para los días, «M» (mayúscula) para los meses y «y» para el año.
Ejercicio 4
Mostrar los empleados y su fecha de nacimiento en diferentes formatos, note que al usar tres letras M se muestre el mes en abreviatura, si se usan mas de tres letras M se muestra el nombre del mes completo.
select
Concat_ws(Space(1),E.TitleOfCourtesy,E.FirstName,E.LastName) As ‘Empleado’,
format(E.BirthDate, ‘dd/MM/yyyy’) As ‘Fecha de nacimiento’,
format(E.BirthDate, ‘dd – MMM – yyyy’) As ‘Fecha de nacimiento’,
format(E.BirthDate, ‘MMMM, dd – yyyy’) As ‘Fecha de nacimiento’
from dbo.Employees As E
go
La imagen muestra el resultado

Ejercicio 5
Listar los empleados, los que tienen menos de 5 años de contratados son Junior, entre 5 y 10 años de contratados son Senior y mas de 10 años, Proffesional.
select
Concat_ws(Space(1),E.TitleOfCourtesy, E.FirstName, E.LastName) As ‘Empleado’,
Format(E.HireDate, ‘dd/MM/yyyy’) As ‘Fecha de ingreso’,
iif(Dateadd(YEAR,Datediff(YEAR, E.HireDate,GetDate()),E.HireDate)> GetDate(),
Datediff(YEAR, E.HireDate,GetDate())-1,
Datediff(YEAR, E.HireDate,GetDate())) As ‘Años de contratado’,
Case
when
iif(Dateadd(YEAR,Datediff(YEAR, E.HireDate,GetDate()),E.HireDate)> GetDate(),
Datediff(YEAR, E.HireDate,GetDate())-1,
Datediff(YEAR, E.HireDate,GetDate())) <5 then ‘Junior’ when iif(Dateadd(YEAR,Datediff(YEAR, E.HireDate,GetDate()),E.HireDate)> GetDate(),
Datediff(YEAR, E.HireDate,GetDate())-1,
Datediff(YEAR, E.HireDate,GetDate())) between 5 and 10
then ‘Senior’
when
iif(Dateadd(YEAR,Datediff(YEAR, E.HireDate,GetDate()),E.HireDate)> GetDate(),
Datediff(YEAR, E.HireDate,GetDate())-1,
Datediff(YEAR, E.HireDate,GetDate())) >10
then ‘Proffesional’
End
As ‘Calificación’
from dbo.Employees As E
go
Vamos a cambiar la fecha de ingreso, el campo HireDate para comprobar una calificación diferente.
La fecha de hoy es 24 de febrero de 2023
Empleado con Id = 3 cambiado al 24 de febrero de 2016, para que esté dentro de la calificación Senior.
Update dbo.Employees set HireDate = ’24/02/2016′
where EmployeeID = 3
go
Empleado con Id = 4 cambiado al 24 de febrero de 2020, para que esté dentro de la calificación Junior.
Update dbo.Employees set HireDate = ’24/02/2020′
where EmployeeID = 4
go
Ejecutamos el listado, el resultado se muestra en la siguiente imagen
