You are on page 1of 5

Funciones para el uso de fechas y horas

Microsoft SQL Server ofrece algunas funciones para trabajar con fechas y horas. Estas son algunas: - getdate(): retorna la fecha y hora actuales. Ejemplo: select getdate(); - datepart(partedefecha,fecha): retorna la parte especfica de una fecha, el ao, trimestre, da, hora, etc. Los valores para "partedefecha" pueden ser: year (ao), quarter (cuarto), month (mes), day (dia), week (semana), hour (hora), minute (minuto), second (segundo) y millisecond (milisegundo). Ejemplos: select datepart(month,getdate()); retorna el nmero de mes actual; select datepart(day,getdate()); retorna el da actual; select datepart(hour,getdate()); retorna la hora actual; - datename(partedefecha,fecha): retorna el nombre de una parte especfica de una fecha. Los valores para "partedefecha" pueden ser los mismos que se explicaron anteriormente. Ejemplos: select datename(month,getdate()); retorna el nombre del mes actual; select datename(day,getdate()); - dateadd(partedelafecha,numero,fecha): agrega un intervalo a la fecha especificada, es decir, retorna una fecha adicionando a la fecha enviada como tercer argumento, el intervalo de tiempo indicado por el primer parmetro, tantas veces como lo indica el segundo parmetro. Los valores para el primer argumento pueden ser: year (ao), quarter (cuarto), month (mes), day (dia), week (semana), hour (hora), minute (minuto), second (segundo) y millisecond (milisegundo). Ejemplos: select dateadd(day,3,'1980/11/02'); retorna "1980/11/05", agrega 3 das.

select dateadd(month,3,'1980/11/02'); retorna "1981/02/02", agrega 3 meses. select dateadd(hour,2,'1980/11/02'); retorna "1980/02/02 2:00:00", agrega 2 horas. select dateadd(minute,16,'1980/11/02'); retorna "1980/02/02 00:16:00", agrega 16 minutos. - datediff(partedelafecha,fecha1,fecha2): calcula el intervalo de tiempo (segn el primer argumento) entre las 2 fechas. El resultado es un valor entero que corresponde a fecha2-fecha1. Los valores de "partedelafecha) pueden ser los mismos que se especificaron anteriormente. Ejemplos: select datediff (day,'2005/10/28','2006/10/28'); retorna 365 (das). select datediff(month,'2005/10/28','2006/11/29'); retorna 13 (meses). - day(fecha): retorna el da de la fecha especificada. Ejemplo: select day(getdate()); - month(fecha): retorna el mes de la fecha especificada. Ejemplo: select month(getdate()); - year(fecha): retorna el ao de la fecha especificada. Ejemplo: select year(getdate()); Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo datetime o smalldatetime.

11.3.1.1. Propiedades de TIMESTAMP desde MySQL 4.1 Los tipos DATETIME, DATE, and TIMESTAMP estn relacionados. Esta seccin describe sus caractersticas, en qu se parecen y en qu difieren. El tipo DATETIME se usa cuando necesita valores que contienen informacin de fecha y hora. MySQL recibe y muestra los valores DATETIME en formato 'YYYY-MM-DD HH:MM:SS' . El rango soportado es de '1000-01-01 00:00:00' a '9999-12-31 23:59:59'. (Soportado significa que aunque valores anteriores pueden funcionar, no hay garantas) El tipo DATE se usa cuando necesita slo un valor de fecha, sin una parte de hora. MySQL recibe y muestra los valores DATE en formato 'YYYY-MM-DD' . El rango soportado es de '1000-01-01' a '9999-12-31'. El tipo TIMESTAMP tiene varias propiedades, en funcin de la versin de MySQSL y el modo SQL que est ejecutando el servidor. Estas propiedades se describen posteriormente en esta seccin. Puede especificar valores DATETIME, DATE, y TIMESTAMP usando cualquier de los siguientes formatos:

Como cadena de caracteres en formato 'YYYY-MM-DD HH:MM:SS' o 'YY-MM-DD HH:MM:SS' . Una sintaxis relajada se permite: Cualquier carcter de puntuacin puede usarse como delimitador entre partes de fecha o de hora. Por ejemplo, '9812-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45', y '98@12@31 11^30^45' son equivalentes. Como cadena de caracteres en formato 'YYYY-MM-DD' or 'YY-MM-DD' . Se permite una sintaxis relajada . Por ejemplo, '98-12-31', '98.12.31', '98/12/31', y '98@12@31' son equivalentes. Como cadena de caracteres sin delimitadores en formato 'YYYYMMDDHHMMSS' o 'YYMMDDHHMMSS', mientras que la cadena de caracteres tenga sentido como fecha. Por ejemmplo, '19970523091528' y '970523091528' se interpretan como '1997-05-23 09:15:28', pero '971122129015' es ilegal (tiene una parte de minutos sin sentido) y se convierte en '0000-00-00 00:00:00'. Como cadena de caracteres sin delimitadores en formato 'YYYYMMDD' o 'YYMMDD' , mientras que el cadena de caracteres tenga sentido como fecha. Por ejemplo, '19970523' y '970523' se interpretan como '1997-05-23', pero '971332' es ilegal (tiene una parte de mes y da sin sentido) y se convierte en '0000-00-00'. Como nmero en formato YYYYMMDDHHMMSS o YYMMDDHHMMSS, mientras que el nmero tenga sentido como fecha. Por ejemplo, 19830905132800 y 830905132800 se interpretan como '1983-09-05 13:28:00'. Como nmero en formato YYYYMMDD o YYMMDD, mientras que el nmero tenga sentido como fecha. Por ejemplo, 19830905 y 830905 se interpretan como '198309-05'. Como resultado de una funcin que retorne un valor acceptable en un contexto DATETIME, DATE, o TIMESTAMP , como NOW() o CURRENT_DATE.

Los valores ilegales de DATETIME, DATE, o TIMESTAMP se convierten al valor cero del tipo apropiado ('0000-00-00 00:00:00', '0000-00-00', o 00000000000000). Para valores especificados como cadenas de caracteres que incluyan partes de fecha delimitadas, no es necesario especificar dos dgitos para valores de mes o da menores que 10. '1979-6-9' es lo mismo que '1979-06-09'. Similarmente, para valores especificados como cadenas de caracteres que incluyan delimitadores para la parte de hora, no es necesario especificar dos dgitos para horas, minutos o segundos menores que 10. '1979-10-30 1:2:3' es lo mismo que '1979-10-30 01:02:03'. Los valores especificados como nmeros deben tener una longitud de 6, 8, 12, o 14 dgitos. Si un nmero tiene una longitud de 8 o 14 dgitos, se asume que est en formato YYYYMMDD o YYYYMMDDHHMMSS y que el ao lo dan los primeros 4 dgitos. Si el nmero tiene 6 o 12 dgitos de longitud, se asume que est en formato YYMMDD o YYMMDDHHMMSS y que el ao lo dan los primeros 2 dgitos. A los nmeros que no tengan estas longitudes se les aaden ceros a la izquierda hasta la longitud ms cercana permitida. Los valores especificados como cadenas de caracteres no delimitadas se interpretan usando su longitud. Si la cadena de caracteres tiene longitud 8 o 14, el ao se asume como dado por los primeros 4 caracteres. En el resto de caso, se supone que el ao lo dan los primeros 2 caracteres. La cadena de caracteres se interpreta de izquierda a derecha para encontrar el ao, mes, da, hora, minuto y segundo, para tantas partes como representa la cadena de caracteres. Esto significa que no debe usar cadenas de caracteres con menos de 6 caracteres. Por ejemplo, si especifica '9903', pensando que representa Marzo, 1999, MySQL inserta un valor cero en la tabla. Esto es porque el valor de ao y mes son 99 y 03, pero la parte de da no se encuentra, as que el valor no es una fecha legal. Sin embargo, puede especificar explcitamente un valor de cero para representar partes de da y mes. Por ejemplo, puede usar '990300' para insertar el valor '1999-03-00'. Puede asignar valores de un tipo a un objeto de un tipo diferente hasta un lmite. Sin embargo, hay algunas alteraciones del valor o prdidas de informacin:

Si asigna un valor DATE a un objeto DATETIME o TIMESTAMP, la parte de hora del valor resultante se cambia a '00:00:00' ya que el valor DATE no contiene informacin temporal. Si asigna un valor DATETIME o TIMESTAMP a un objeto DATE, la parte temporal del valor resultante se borra porque el tipo DATE no tiene informacin temporal. Tenga en cuenta que aunque DATETIME, DATE, y TIMESTAMP pueden especificarse usando el mismo conjunto de formatos, los tipos no tienen el mismo rango de valores. Por ejemplo, TIMESTAMP no pueden ser anteriores a 1970 o posteriores a 2037. Esto significa que una fecha como '1968-01-01', que sera legal como DATETIME o DATE no es un valor vlido TIMESTAMP y se convierte a 0 si se asigna a un objeto de este tipo.

Tenga en cuenta ciertas cosas al especificar valores temporales:

El formato relajado para valores especificados como cadenas de caracteres puede ser problemtico. Por ejemplo, un valor como '10:11:12' puede parecer una hora por el delimitador ':' , pero si se usa en un contexto de fecha se interpreta como '2010-11-12'. El valor '10:45:15' se convierte a '0000-00-00' ya que '45' no es un mes legal.

El servidor MySQL realiza slo chequeo bsico de la validez de las fechas: Los rangos para ao, mes y da son de 1000 a 9999, 00 a 12, y 00 a 31, respectivamente. Cualquier fecha que contenga partes fuera de estos rangos est sujeta a conversin a '0000-00-00'. Tenga en cuenta que esto permite almacenar fechas invlidas como '2002-04-31'. Para asegurar que una fecha es vlida, haga una comprobacin en su aplicacin. Fechas con valores de ao de dos dgitos son ambguas porque no se conoce el siglo. MySQL interpreta los aos de dos dgitos usando las siguientes reglas: Los valores de aos en el rango 00-69 se convierten a 2000-2069. Los valores de aos en el rango 70-99 se convierten a 1970-1999.

-- String date only formats SELECT convert(varchar, getdate(), 101) MM/DD/YYYY SELECT convert(varchar, getdate(), 102) SELECT convert(varchar, getdate(), 103) SELECT convert(varchar, getdate(), 104) SELECT convert(varchar, getdate(), 105) SELECT convert(varchar, getdate(), 106) SELECT convert(varchar, getdate(), 107) SELECT convert(varchar, getdate(), 111) SELECT convert(varchar, getdate(), 112) SELECT convert(varchar, getdate(), 3) MM/DD/YY SELECT convert(varchar, getdate(), 4) SELECT convert(varchar, getdate(), 5) SELECT convert(varchar, getdate(), 6) SELECT convert(varchar, getdate(), 7) SELECT convert(varchar, getdate(), 11) YY/MM/DD -- 03/15/2018 -- 2018.03.15 -- 15/03/2018 -- 15.03.2018 -- 15-03-2018 -- 15 Mar 2018 -- Mar 15, 2018 -- 2018/03/15 -- 20180315 -- 15/03/18 -- 15.03.18 -- 15-03-18 -- 15 Mar 18 -- Mar 15, 18 -- 18/03/15 ----

SELECT convert(varchar, getdate(), 12)

-- 180315

-- YYMMDD

You might also like