Transact-SQL incluye un montón de funciones que nos ayudan a trabajar con fechas y horas. Una de las tareas más comunes cuando se trabaja con fechas es extraer las diferentes partes de la fecha. Por ejemplo, a veces solo queremos el año o el mes. Otras veces podríamos querer el día de la semana. De cualquier manera, hay muchas maneras de hacer esto en SQL Server.
En particular, las siguientes funciones le permiten devolver el día, el mes y el año a partir de una fecha en SQL Server.
DAY()
,MONTH()
yYEAR()
DATEPART()
DATENAME()
FORMAT()
Estas funciones se explican a continuación.
Funciones DÍA(), MES() y AÑO()
La forma más obvia de devolver el día, el mes y el año a partir de una fecha es utilizar las funciones T-SQL del mismo nombre. Sí, T-SQL tiene funciones creadas específicamente con el propósito de devolver estas tres partes de fechas.
He aquí un ejemplo de cómo funcionan:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DAY(@date) AS DAY, MONTH(@date) AS MONTH, YEAR(@date) AS YEAR;
Resultado:
+-------+---------+--------+ | DAY | MONTH | YEAR | |-------+---------+--------| | 2 | 6 | 2018 | +-------+---------+--------+
Estas funciones devuelven la parte de la fecha como un número entero. Devuelven el mismo resultado que DATEPART()
la función regresa para la parte de la fecha especificada.
Función DATEPART()
El DATEPART()
La función se creó específicamente para devolver partes específicas de una fecha. Por lo tanto, podemos usar esta función para devolver exactamente el mismo resultado que el ejemplo anterior:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATEPART(day, @date) AS DAY, DATEPART(weekday, @date) AS WEEKDAY, DATEPART(month, @date) AS MONTH, DATEPART(year, @date) AS YEAR;
Resultado:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | 7 | 6 | 2018 | +-------+-----------+---------+--------+
Una ventaja de utilizar esta función es que también puede devolver otras partes de la fecha y la hora. Como puede ver con este ejemplo, devolví el día de la semana y el día (day
es el día del mes, weekday
es el día de la semana). También puede devolver las distintas partes del tiempo, como minutos, segundos, milisegundos, etc. Para obtener más ejemplos, consulte DATEPART()
Ejemplos en SQL Server.
El DATEPART()
La función devuelve su resultado como un número entero y, por lo tanto, no podrá obtener el nombre del mes o el nombre del día de la semana a partir de la fecha. Pero no te preocupes, puedes usar el DATENAME()
o FORMAT()
funciones para eso.
Función DATENAME()
El DATENAME()
la función es similar a DATEPART()
función, excepto que devuelve el resultado como una cadena de caracteres en lugar de un número entero. DATENAME()
también devuelve el mes y el día de la semana como su nombre completo, en lugar de su valor numérico.
Ejemplo:
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT DATENAME(day, @date) AS DAY, DATENAME(weekday, @date) AS WEEKDAY, DATENAME(month, @date) AS MONTH, DATENAME(year, @date) AS YEAR;
Resultado:
+-------+-----------+---------+--------+ | DAY | WEEKDAY | MONTH | YEAR | |-------+-----------+---------+--------| | 2 | Saturday | June | 2018 | +-------+-----------+---------+--------+
Para obtener más ejemplos de esta función, consulte DATENAME()
Ejemplos en SQL Server.
Función FORMATO()
Podemos usar el FORMAT()
función para devolver los mismos valores que con DATENAME()
funciones y más.
Esta es una función más versátil que las anteriores. Le permite dar formato a la fecha/hora, así como a los valores numéricos como cadenas. El valor devuelto es nvarchar o nulo (dependiendo de la entrada), y la longitud de la cadena está determinada por el formato especificado.
FORMAT()
también proporciona más opciones sobre cómo se presenta la parte de la fecha. Puede especificar si mostrarlo como un solo carácter, dos caracteres, tres, cuatro e incluso cinco en algunos casos.
Aquí hay ejemplos para demostrar.
Día
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS d, FORMAT(@date, 'dd') AS dd, FORMAT(@date, 'ddd') AS ddd, FORMAT(@date, 'dddd') AS dddd;
Resultado:
+-----+------+-------+----------+ | d | dd | ddd | dddd | |-----+------+-------+----------| | 2 | 02 | Sat | Saturday | +-----+------+-------+----------+
Mes
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'M ') AS M, FORMAT(@date, 'MM') AS MM, FORMAT(@date, 'MMM') AS MMM, FORMAT(@date, 'MMMMM') AS MMMM;
Resultado:
+-----+------+-------+--------+ | M | MM | MMM | MMMM | |-----+------+-------+--------| | 6 | 06 | Jun | June | +-----+------+-------+--------+
Año
DECLARE @date datetime2 = '2018-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Resultado:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 18 | 18 | 2018 | 2018 | 02018 | +-----+------+-------+--------+---------+
Tenga en cuenta que tenemos la opción de formatear la parte del año con cinco dígitos.
Acerca del número de dígitos
Al devolver una parte de fecha en formato de dígito, el especificador de formato determina el número mínimo de dígitos que se devolverán. Por ejemplo, al usar yyy
, el año se devolverá como tres dígitos si el año es 0008
pero como cuatro dígitos si el año es 2008
.
Ejemplo:
DECLARE @date datetime2 = '0008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'y ') AS y, FORMAT(@date, 'yy') AS yy, FORMAT(@date, 'yyy') AS yyy, FORMAT(@date, 'yyyy') AS yyyy, FORMAT(@date, 'yyyyy') AS yyyyy;
Resultado:
+-----+------+-------+--------+---------+ | y | yy | yyy | yyyy | yyyyy | |-----+------+-------+--------+---------| | 8 | 08 | 008 | 0008 | 00008 | +-----+------+-------+--------+---------+
Además, al usar la opción única (por ejemplo, d
) como especificador de fecha, deberá agregar un espacio si solo desea que esa parte de fecha se devuelva sola. Si no hace esto, obtendrá más que esa única fecha parcial.
Ejemplo:
DECLARE @date datetime2 = '2008-06-02 08:24:14.3112042'; SELECT FORMAT(@date, 'd ') AS 'Space', FORMAT(@date, 'd') AS 'No Space', FORMAT(@date, 'M ') AS 'Space', FORMAT(@date, 'M') AS 'No Space', FORMAT(@date, 'y ') AS 'Space', FORMAT(@date, 'y') AS 'No Space';
Resultado:
+---------+------------+---------+------------+---------+------------+ | Space | No Space | Space | No Space | Space | No Space | |---------+------------+---------+------------+---------+------------| | 2 | 6/2/2008 | 6 | June 2 | 8 | June 2008 | +---------+------------+---------+------------+---------+------------+
Para más FORMAT()
ejemplos, consulte Cómo formatear la fecha y la hora en SQL Server.