web-dev-qa-db-fra.com

Requête SQL pour insérer date / heure dans SQL Server

Je veux insérer une valeur datetime dans une table (SQL Server) à l'aide de la requête SQL ci-dessous

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

Mais je reçois cette erreur msg. Incorrect syntax near '10'.

J'ai essayé avec les citations

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

Je reçois ce message d'erreur Cannot convert varchar to datetime

Aide gentillement! Merci.

119
Shee

Vous souhaiterez utiliser AAAAMMJJ pour la détermination de date sans ambiguïté dans SQL Server.

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

Si vous êtes marié au format _dd-mm-yy hh:mm:ss xm_, vous devrez utiliser CONVERT avec le style spécifique.

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

5 voici le style pour les dates italiennes. Eh bien, pas seulement les Italiens, mais c'est la culture qui lui est attribuée dans Books Online .

200
RichardTheKiwi

Un choix plus indépendant de la langue pour les littéraux de chaîne est la norme internationale ISO 8601 format "AAAA-MM-JJThh: mm: ss". J'ai utilisé la requête SQL ci-dessous pour tester le format, et cela fonctionne bien dans tous les langages SQL de 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

Selon la section Formats de date et d'heure littéraux de chaîne de Microsoft TechNet, le format de date ANSI standard SQL standard "AAAA-MM-JJ hh: mm: ss" est supposé être "multilingue". Cependant, en utilisant la même requête, le format ANSI ne fonctionne pas dans tous les langages SQL.

Par exemple, en danois, vous rencontrerez de nombreuses erreurs telles que:

Erreur de langue Danois La conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites.

Si vous souhaitez créer une requête en C # à exécuter sur SQL Server et que vous devez transmettre une date au format ISO 8601, utilisez le spécificateur de format Sortable "s" :

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

Le studio de gestion crée des scripts tels que:

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

vous devez l'ajouter comme

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

Pas besoin d'utiliser convert. Il suffit de l'indiquer comme date citée au format ISO 8601.
Ainsi:

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

Le séparateur doit être un / et il doit être entouré de guillemets simples '.

2
Johan

Si vous stockez des valeurs via n'importe quel langage de programmation

Voici un exemple en C #

Pour stocker la date, vous devez d'abord la convertir, puis la stocker.

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

FooDate est une variable datetime contenant votre date dans votre format.

1
Pankaj

Je rencontre un problème plus générique: obtenir différents formats (et pas nécessairement connus) datetime et les insérer dans une colonne datetime. Je l'ai résolu en utilisant cette déclaration, qui est finalement devenue une fonction scalaire (pertinente pour ODBC, style canonique, américain, ANSI et britannique\franch date - peut être étendue):

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))) 
1
Guy E