Compartir a través de


date (Transact-SQL)

Define una fecha en SQL Server.

Se aplica a: SQL Server (desde SQL Server 2008 hasta la versión actual), Windows Azure SQL Database (desde la versión inicial hasta la versión actual).

Descripción de date

Propiedad

Valor

Sintaxis

date

Uso

DECLARE @MyDate date

CREATE TABLE Table1 ( Column1 date )

Formato de literal de cadena predeterminado

(se usa para el cliente de nivel inferior)

AAAA-MM-DD

Para obtener más información, vea la sección "Compatibilidad con versiones anteriores de los clientes de niveles inferiores" más adelante.

Intervalo

De 0001-01-01 a 9999-12-31

Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999

Intervalos de elementos

AAAA es una cifra de cuatro dígitos comprendida entre 0001 y 9999 que representa un año.

MM es una cifra de dos dígitos comprendida entre 01 y 12 que representa un mes del año especificado.

DD es una cifra de dos dígitos comprendida entre 01 y 31 dependiendo del mes, que representa un día del mes especificado.

Longitud en caracteres

10 posiciones

Precisión, escala

10, 0

Tamaño de almacenamiento

3 bytes, fijo

Estructura de almacenamiento

1, fecha de almacenes de enteros de 3 bytes.

Precisión

Un día

Valor predeterminado

1900-01-01

Este valor se utiliza para la parte de fecha anexada para la conversión implícita de time a datetime2 o datetimeoffset.

Calendario

Gregoriano

Precisión de fracciones de segundo definida por el usuario

No

Conservación y reconocimiento del ajuste de zona horaria

No

Reconocimiento del horario de verano

No

Formatos del literales de cadena compatibles para date

En las tablas siguientes se muestran los formatos de literales de cadena válidos para el tipo de datos date.

Numérico

Descripción

mda                         

[m]m/dd/[aa]aa       

[m]m-dd-[aa]aa       

[m]m.dd.[aa]aa       

mad                         

mm/[aa]aa/dd       

mm-[aa]aa/dd       

[m]m.[aa]aa.dd       

dma                         

dd/[m]m/[aa]aa       

dd-[m]m-[aa]aa       

dd.[m]m.[aa]aa       

dam                         

dd/[aa]aa/[m]m       

dd-[aa]aa-[m]m       

dd.[aa]aa.[m]m       

amd                         

[aa]aa/[m]m/dd       

[aa]aa-[m]m-dd       

[aa]aa-[m]m-dd       

[m]m, dd, y [aa]aa representa el mes, el día y el año en una cadena con marcas de barras diagonales (/), guiones (-) o puntos (.) como separadores.

Solo se admiten los años de dos o cuatro dígitos. Siempre que sea posible utilice los años de cuatro dígitos. Para especificar un número entero entre 0001 y 9999 que represente el año límite para interpretar años de dos dígitos como años de cuatro dígitos, utilice la Establecer la opción de configuración del servidor Fecha límite de año de dos dígitos.

Un año de dos dígitos menor o igual que los últimos dos dígitos del año límite pertenece al mismo siglo que el año límite. En cambio, un año de dos dígitos mayor que los últimos dos dígitos del año límite pertenece al siglo anterior al año límite. Por ejemplo, si el valor del año límite de dos dígitos es 2049 (el valor predeterminado), el año de dos dígitos 49 se interpreta como 2049 y el año de dos dígitos 50 se interpreta como 1950.

La configuración de idioma actual está determinada por el formato de fecha predeterminado. Para cambiar el formato de la fecha, utilice las instrucciones SET LANGUAGE y SET DATEFORMAT.

El formato ydm no se admite para date.

Alfabético

Descripción

mes [dd][,] aaaa      

mes dd[,] [aa]aa      

mes aaaa [dd]          

[dd] mes[,] aaaa      

dd mes[,][aa]aa       

dd [aa]aa mes         

[dd] aaaa mes         

aaaa mes [dd]         

aaaa [dd] mes         

mon representa el nombre completo del mes o la abreviatura del mes en el idioma actual. Las comas son opcionales y se omite el uso de mayúsculas.

Para evitar la ambigüedad, use años de cuatro dígitos.

Si falta el día, se usará el primer día del mes.

ISO 8601

Descripción

AAAA-MM-DD            

YYYYMMDD               

Igual que el estándar SQL. Éste es el único formato que se define como una norma internacional.

Sin separación

Descripción

[aa]aammdd            

aaaa[mm][dd]          

Los datos de tipo date se pueden especificar con cuatro, seis u ocho dígitos. Una cadena de seis u ocho dígitos se interpreta siempre como ymd. El mes y el día deben ser siempre de dos dígitos. Una cadena de cuatro dígitos se interpreta como el año.

ODBC

Descripción

{ d 'aaaa-mm-dd' }   

Específico de la API de ODBC.

Formato W3C XML

Descripción

aaaa-mm-ddDZH      

Específicamente admitido para uso de XML/SOAP.

DZH es el designador de zona horaria (Z o + hh: mm o -hh:mm).

  • hh:mm representa el ajuste de zona horaria. hh es una cifra de dos dígitos, de 0 a 14, que representa el número de horas del ajuste de zona horaria.

  • MM es una cifra de dos dígitos, de 0 a 59, que representa el número de minutos adicionales en el ajuste de zona horaria.

  • + (más) o – (menos) es el signo que se usa obligatoriamente para indicar el ajuste de zona horaria. Indica si el ajuste de zona horaria se suma o resta de la hora universal coordinada (UTC) para obtener la hora local. El intervalo válido de ajuste de zona horaria es de -14: 00 a +14: 00.

Compatibilidad con ANSI e ISO 8601

date cumple la definición del estándar ANSI SQL para el calendario Gregoriano: "NOTA 85 - los tipos de datos datetime permitirán las fechas en el formato Gregoriano que se va a almacenar en el intervalo de fechas de 0001.01.01 CE a 9999-12-31 CE."

El formato predeterminado del literal de cadena (que se usa para clientes de nivel inferior) cumple con el formato del estándar SQL, que se define como AAAA-MM-DD. Este formato es igual que la definición de ISO 8601 para DATE.

Compatibilidad con versiones anteriores de los clientes de niveles inferiores

Algunos clientes de niveles inferiores no admiten los tipos de datos time, date, datetime2 y datetimeoffset. En la tabla siguiente se muestra la asignación de tipo entre una instancia de nivel superior de SQL Server y los clientes de nivel inferior.

Tipo de datos SQL Server

El formato del literal de cadena predeterminado se pasó al cliente de nivel inferior

ODBC de nivel inferior

OLEDB de nivel inferior

JDBC de nivel inferior

SQLCLIENT de nivel inferior

time

hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR o SQL_VARCHAR

DBTYPE_WSTR o DBTYPE_STR

Java.sql.String

Cadena o SqString

date

AAAA-MM-DD

SQL_WVARCHAR o SQL_VARCHAR

DBTYPE_WSTR o DBTYPE_STR

Java.sql.String

Cadena o SqString

datetime2

AAAA-MM-DD hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR o SQL_VARCHAR

DBTYPE_WSTR o DBTYPE_STR

Java.sql.String

Cadena o SqString

datetimeoffset

AAAA-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR o SQL_VARCHAR

DBTYPE_WSTR o DBTYPE_STR

Java.sql.String

Cadena o SqString

Convertir datos de fecha y hora

Cuando se convierte a los tipos de datos de fecha y hora, SQL Server rechaza todos los valores que no reconoce como fechas u horas. Para obtener información acerca de cómo usar las funciones CAST y CONVERT con datos de fecha y hora, vea CAST y CONVERT (Transact-SQL).

Tipo de datos al que se convierte

Detalles de la conversión

time(n)

La conversión no se produce y se recibe el mensaje de error 206: "Conflicto de tipos de operandos: date es incompatible con time".

datetime

Se copia la fecha y el componente de hora se establece en 00:00:00.000. El código siguiente muestra los resultados de convertir un valor de date en un valor de datetime.

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

Cuando el valor de date está en el intervalo de un valor de smalldatetime, se copia el componente de fecha y el componente de hora se establece en 00:00:00. Cuando el valor de date está fuera del intervalo de un valor de smalldatetime, se recibe el mensaje de error 242: "La conversión del tipo de datos date en smalldatetime produjo un valor fuera de intervalo", y el valor de smalldatetime se establece en NULL.

El código siguiente muestra los resultados de convertir un valor de date en un valor de smalldatetime.

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

Se copia la fecha, y la hora se establece en 00:00.0000000 +00:00.

El código siguiente muestra los resultados de convertir un valor de date en un valor de datetimeoffset(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

El componente de fecha se copia y el componente de hora se establece en 00:00:00.00 con independencia del valor de (n).

En el código siguiente se muestran los resultados de convertir un valor date en un valor datetime2(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.00
--
--(1 row(s) affected)

Convertir tipos date a otros tipos de fecha y hora

En la tabla siguiente se describe lo que ocurre cuando un tipo de datos date se convierte a otros tipos de datos de fecha y hora.

Tipo de datos al que se convierte

Detalles de la conversión

time(n)

La conversión no se produce y se recibe el mensaje de error 206: "Conflicto de tipos de operandos: date es incompatible con time".

datetime

Se copia la fecha. El código siguiente muestra los resultados de convertir un valor de date en un valor de datetime.

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

Cuando el valor de date está en el intervalo de un valor de smalldatetime, se copia el componente de fecha y el componente de hora se establece en 00:00:00.000. Cuando el valor de date está fuera del intervalo de un valor de smalldatetime, se recibe el mensaje de error 242: "La conversión del tipo de datos date en smalldatetime produjo un valor fuera de intervalo", y el valor de smalldatetime se establece en NULL.

El código siguiente muestra los resultados de convertir un valor de date en un valor de smalldatetime.

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

Se copia la fecha, y la hora se establece en 00:00.0000000 +00:00.

El código siguiente muestra los resultados de convertir un valor de date en un valor de datetimeoffset(3).

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

Se copia el componente de fecha, y el componente de hora se establece en 00:00.000000.

En el código siguiente se muestran los resultados de convertir un valor date en un valor datetime2(3).

DECLARE @date date = '1912-10-25'
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)

Convertir literales de cadena a date

Las conversiones de literales de cadena en tipos de fecha y hora son posibles cuando todas las partes de las cadenas están en formatos válidos. En caso contrario, se generará un error en el tiempo de ejecución. Las conversiones implícitas o explícitas que no especifican un estilo (desde tipos de fecha y hora hasta literales de cadena) estarán en el formato predeterminado de la sesión actual. En la tabla siguiente se muestran las reglas para convertir un literal de cadena al tipo de datos date.

Literal de cadena de entrada

date

DATE de ODBC

Los literales de cadena de ODBC se asignan al tipo de datos datetime. Cualquier operación de asignación de los literales de DATETIME de ODBC a un tipo date provocará una conversión implícita entre datetime y este tipo, tal y como se define en las reglas de conversión.

TIME de ODBC

Vea la regla anterior de DATE de ODBC.

DATETIME DE ODBC

Vea la regla anterior de DATE de ODBC.

Solo DATE

Trivial

Solo TIME

Se proporcionan los valores predeterminados.

Solo TIMEZONE

Se proporcionan los valores predeterminados.

DATE + TIME

Se usa la parte DATE de la cadena de entrada.

DATE + TIMEZONE

No permitido.

TIME + TIMEZONE

Se proporcionan los valores predeterminados.

DATE + TIME + TIMEZONE

Se usará la parte DATE de DATETIME local.

Ejemplos

En el ejemplo siguiente se comparan los resultados de convertir una cadena a cada tipo de datos de fecha y hora.

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 
        'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 
        'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 
        'datetimeoffset';

El conjunto de resultados es el siguiente.

Tipo de datos

Salida

time

12:35:29. 1234567

date

2007-05-08

smalldatetime

2007-05-08 12:35:00

datetime

2007-05-08 12:35:29.123

datetime2

2007-05-08 12:35:29. 1234567

datetimeoffset

2007-05-08 12:35:29.1234567 +12:15

Vea también

Referencia

CAST y CONVERT (Transact-SQL)