SQL Server provee tipos de datos especiales para el manejo de valores fechas y hora, estos tipos facilitan el
manejo y validación de este tipo de información tan importante.
Hasta SQL 2008 los tipos de datos para guardar valores tipo fecha habían sido los tipos de datos DATETIME y
SMALLDATETIME, estos tipos de datos almacenan tanto la hora como la fecha de forma conjunta. Luego en
SQL 2008 aparecen otros tipos que agregan muchas posibilidades como son: manejar la fecha y la hora de
forma separada, rango de validez incrementado, etc.
ALMACENAMIENTO
¿En qué formato se guarda el valor?, SQL guarda los datos de fecha y hora como valores enteros de 2 o 4 bytes.
El tipo DATETIME toma los primeros 4 bytes para la fecha y los otros 4 bytes para la hora, el tipo
SMALLDATETIME toma 2 bytes para cada valor. Esto quiere decir que la fecha no se guarda en DD/MM/YYY o
MM/DD/YYYY, etc., sino como un número.
TIPOS DE DATOS
TIPO
DATETIME
SMALLDATETIME
TIMESTAMP
Bytes
8
4
Rango
Jan 1, 1753 - Dec 31, 9999
Jan 1, 1900 - Jun 6, 2079
3
0001-01-01 - 9999-12-31
3a5
00:00:00.0000000 - 23:59:59:9999999
3a6
0001-01-01
9999-12-31
(Se utiliza para marcar un registro con la fecha de
actualización o inserción)
DATE
(SQL 2008)
TIME
(Nuevo en SQL
hh:mm:ss.nnnnnnn)
2008.
Maneja
el
formato
DATETIME2
(Es similar al DATETIME pero con un mayor rango.)
00:00:00.0000000
23:59:59.9999999
-
INSERTANDO
SQL soporta varios formatos para insertar o colocar un valor tipo fecha, estos valores sea cual sea el formato
deben ser fechas validas. La mayor parte de los formatos validará las configuraciones del lenguaje donde se
esté aplicando la sentencia, sin embargo resulta mucho más práctico utilizar el estándar ANSI (YYYYMMDD
HH:MM:SS) y no depender de configuraciones regionales.
Antes de existir el tipo de dato DATE debíamos tener especial cuidado al momento de insertar en valor tipo
fecha con el tema de la parte del tiempo (HH:MM:SS). Si el interés es manejar una fecha corta (YYYYMMDD)
entonces se registra 00:00:00 en la parte del tiempo, esto permite que la fecha puede ser consultada sin indicar
el tiempo. Si el interés es manejar la fecha larga (YYYYMMDD HH:MM:SS) entonces debemos siempre
consultar la fecha tomando en cuenta el tiempo, de lo contrario esos registros que tienen ese dato del tiempo no
aparecerían a menos que se filtre por un rango: Fecha BETWEEN ‘2011-01-01 00:00:00’ and ‘2011-01-01
SQL Server – Carlos Caraballo
Page 1
23:59:00’, algo así tomaría en cuenta todos los registros de la fecha ‘2011-01-01’ con cualquier hora que tenga
registrada.
INSERT INTO empleado( fecha) VALUES( ‘20110120 22:01:20’)
Insertando la fecha en formato ANSI. La hora se indica en el esquema de 24 horas.
INSERT INTO empleado( fecha) VALUES( ‘20110120’)
Insertando la fecha en formato ANSI. Si el campo fecha es un DATETIME se grabará 00:00:00 en la parte del tiempo,
esto permite que el registro pueda ser consultado indicando solo la parte de la fecha. Cuando se indica la hora siempre
tendremos que contemplar la hora en la consulta.
SET DATEFORMAT
Si no se quiere utilizar el formato ANSI el parámetro DATEFORMAT puede ser utilizado para indicar el formato
(“día/mes “o “mes/día”) que deseamos utilizar para registrar o consultar un valor tipo fecha.
SET DATEFORMAT mdy
INSERT INTO empleado( fecha) VALUES( ‘01/20/2010’)
Se le indica al manejador aceptar el valor en el formato mes día.
SET DATEFORMAT dmy
INSERT INTO empleado( fecha) VALUES( ‘20/01/2010’)
Se le indica al manejador aceptar el valor en el formato día mes.
FORMATOS Y CONVERSIONES
Las funciones CAST y CONVERT pueden ser utilizadas para convertir valores fechas, de “string” a fecha y
viceversa o convertir una fecha a un formato o estilo indicado. Ambas funciones trabajan las labores de
conversión, sin embargo solo la función CONVERT nos permite indicar el formato de fecha para el resultado. A
continuación vamos a ver una tabla con los diferentes formatos que podemos aplicar.
SELECT CAST ( fecha as varchar )…..
Convierte una fecha en un valor alfanumérico
SET DATEFORMAT dmy
SELECT CAST( ‘20/01/2011’ as DATETIME)…
Convierte un valor alfanumérico en una valor tipo fecha, en este caso se utiliza DATEFORMAT para indicar el formato
que estamos utilizando para indicar el valor a convertir.
SET LENGUAGE us_english
SELECT CAST( ‘01/20/2011’ as DATETIME)…
Se utiliza SET LENGUAGE para indicar la cultura del valor a convertir.
SELECT CAST( CONVERT( VARCHAR,GETDATE(),101) AS DATETIME )
Extrae la fecha corta de la fecha larga actual y convierte dicho valor en un valor tipo fecha.
F U N CI O N E S
SQL provee un grupo de funciones que permiten desde conseguir la fecha y hora actual del sistema hasta
realizar cualquier tipo de operaciones matemáticas con estos valores.
Función
Descripción
SQL Server – Carlos Caraballo
Ejemplo
Page 4
CURRENT_TIMESTAMP
GETDATE()
DAY
MONTH
YEAR
DATEPART
Retorna la fecha completa actual. Con
este valor se retorna la fecha completa
para cada fila retornada.
Es
un
equivalente
de
CURRENT_TIMESTAMP
con
la
diferencia de que éste puede cambiar a
lo largo del resultado.
Se utiliza para extraer el día de la fecha
Extrae el mes de la fecha
Extrae el año de la fecha
Se utiliza para extraer cualquier parte
de la fecha.
hh: hora
yy: año
dd: día de la semana
wk: semana
mi: minuto
ss: segundo
dy: día del año
dw: día de la semana
qq: Quarter
El formato también puede indicarse en
palabra completa, por ejemplo en vez
de utilizar yy podemos decir year.
http://msdn.microsoft.com/en-us/library/ms189794.aspx
DATENAME
DATEDIFF
DATEADD
Extrae el literal de la parte extraída de
la fecha. Es decir si sacamos el mes, nos
indica el nombre del mes.
Se utiliza para restar valores fechas.
Igual que con DATEPART es importante
se debe indicar el formato en que se
quiere el resultado.
Se utiliza para sumar un valor a una
fecha. El valor a sumar se indica de
acuerdo a las constantes que se utilizan
para extraer una parte de la fecha.
Fecha: 12/20/2010
SELECT DATENAME(mm,fecha)
Saca el valor “Diciembre”
SELECT DATEDIFF( dd,fecha,GETDATE() )
Resta GETDATE – fecha y devuelve el
resultado en días.
Fecha: 12/20/2010
SELECT DATEADD(mm,2,fecha)
Suma 2 meses al valor fecha.
R EFERENCIAS
http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx