Consulta SQL para insertar fecha y hora en SQL Server


133

Quiero insertar un datetimevalor en una tabla (SQL Server) usando la consulta sql a continuación

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

Pero recibo este mensaje de error. Incorrect syntax near '10'.

Lo intenté con las comillas

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

Me sale este mensaje de error Cannot convert varchar to datetime

Amablemente ayuda! Gracias.

Respuestas:


229

Deberá utilizar el AAAAMMDD para determinar la fecha sin ambigüedades en SQL Server.

insert into table1(approvaldate)values('20120618 10:34:09 AM');

Si está casado con el dd-mm-yy hh:mm:ss xmformato, deberá usar CONVERT con el estilo específico.

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5Aquí está el estilo para las fechas italianas. Bueno, no solo italianos, sino que esa es la cultura a la que se le atribuye en Books Online .


1
Gracias ... funciona. Por cierto, ¿no es posible ingresar en formato DD-MM-AA?
Shee

@RichardTheKiwi, ¿qué 5significa?
Shee

@Shee ver pie de página agregado para responder
RichardTheKiwi

44
Estoy corregido, si está usando YYYYMMDD HH:MM:SS(en el formato de 24 horas, el formato mundial, cualquiera que no sea EE. UU. Usa esto, no solo el ejército ...) sin los guiones, funciona, incluso para el Britishidioma. YYYY-MM-DD HH:MM:SSSin embargo, si usa , falla; en ese caso (con los guiones), debe separar la fecha y la hora con un Tliteral.
marc_s

1
@ Shee Echa un vistazo a la SET DATEFORMATdeclaración . Esta es la configuración para una conexión individual, pero la configuración se puede especificar en todo el servidor. También puede especificar SET LANGUAGEcontrolar cosas como qué carácter se usa para la raíz y tal, y el formato de fecha heredará de eso (nuevamente, en el servidor o en los niveles de conexión). Es solo que el valor predeterminado es inglés de EE. UU. Y mdy es el formato de EE. UU. Sin embargo, ymd con fechas de 4 años siempre funciona.
Bacon Bits

29

Una opción más independiente del idioma para los literales de cadena es el formato estándar internacional ISO 8601 "AAAA-MM-DDThh: mm: ss". Utilicé la consulta SQL a continuación para probar el formato, y de hecho funciona en todos los lenguajes SQL en sys.syslanguages :

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

De acuerdo con la sección Formatos de fecha y hora literales de cadena en Microsoft TechNet, el formato de fecha estándar de ANSI SQL estándar "AAAA-MM-DD hh: mm: ss" se supone que es "multilingüe". Sin embargo, con la misma consulta, el formato ANSI no funciona en todos los lenguajes SQL.

Por ejemplo, en danés, tendrá muchos errores como los siguientes:

Error en el idioma danés La conversión de un tipo de datos varchar a un tipo de datos datetime dio como resultado un valor fuera de rango.

Si desea crear una consulta en C # para ejecutar en SQL Server, y necesita pasar una fecha en el formato ISO 8601, use el especificador de formato "s" ordenable :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

Parece que se puede utilizar YYYYMMDDpara la fecha solamente, y, o bien YYYY-MM-DDThh:mm:ss(con guiones, y sí, una Tentre la fecha y la porción de tiempo!) O YYYYMMDD HH:MM:SS(sin guiones, sin separación literales) para ser verdaderamente independiente del lenguaje ...
marc_s

1
@marc_s: Gracias por el comentario. Edité mi respuesta para mencionar el formato ISO 8601 (que incluye el literal T como mencionaste).
Paul Williams

insertar en @TestLang (langdate) valores ('2012-06-18T10: 34: 09') es la mejor respuesta.
MERT DOĞAN

20

El estudio de gestión crea scripts como:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))

8

necesitas agregarlo como

insert into table1(date1) values('12-mar-2013');

2

No es necesario usar convertir. Simplemente enumérelo como una fecha citada en formato ISO 8601.
Al igual que:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

El separador debe ser a /y debe estar rodeado de 'comillas simples .


1

Si está almacenando valores a través de cualquier lenguaje de programación

Aquí hay un ejemplo en C #

Para almacenar la fecha, primero debe convertirla y luego almacenarla

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate es una variable de fecha y hora que contiene su fecha en su formato.


1

Me encuentro con un problema más genérico: obtener formatos de fecha y hora diferentes (y no necesariamente conocidos) e insertarlos en la columna de fecha y hora. Lo resolví usando esta declaración, que finalmente se convirtió en una función escalar (relevante para el estilo de fecha canónico, estadounidense, ANSI y británico \ franch de ODBC, se puede ampliar):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.