Requête SQL pour insérer datetime dans SQL Server


133

Je souhaite insérer une datetimevaleur 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 j'obtiens ce msg d'erreur. Incorrect syntax near '10'.

Je l'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 aimablement! Merci.

Réponses:


229

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

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

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

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

5voici le style des dattes italiennes. Eh bien, pas seulement les Italiens, mais c'est la culture à laquelle on l'attribue dans Books Online .


1
Merci .. Cela fonctionne. Btw n'est-il pas possible d'entrer au format JJ-MM-AA?
Shee

@RichardTheKiwi qu'est-ce que cela 5signifie?
Shee

@Shee voir le pied de page ajouté pour répondre
RichardTheKiwi

4
Je suis corrigé - si vous utilisez YYYYMMDD HH:MM:SS(au format 24 heures - le format mondial, tout le monde sauf les États-Unis l'utilise, pas seulement l'armée ...) sans les tirets - cela fonctionne, même pour la Britishlangue. Si vous utilisez YYYY-MM-DD HH:MM:SScependant, cela échoue - dans ce cas (avec les tirets), vous devez séparer la date et l'heure par un Tlittéral.
marc_s

1
@Shee Jetez un œil à la SET DATEFORMATdéclaration . Il s'agit du paramètre pour une connexion individuelle, mais le paramètre peut être spécifié à l'échelle du serveur. Vous pouvez également spécifier SET LANGUAGEpour contrôler des choses comme quel caractère est utilisé pour la base et autres, et le format de date héritera de cela (encore une fois, au niveau du serveur ou de la connexion). C'est juste que la valeur par défaut est l'anglais américain et mdy est le format américain. ymd avec des dates de 4 ans fonctionne toujours, cependant.
Bacon Bits

29

Un choix plus indépendant de la langue pour les chaînes littérales est le format ISO 8601 standard international "AAAA-MM-JJThh: mm: ss". J'ai utilisé la requête SQL ci-dessous pour tester le format, et cela fonctionne effectivement 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 les formats de date et d'heure littéraux de chaîne section dans Microsoft TechNet, le format de date standard ANSI standard SQL "AAAA-MM-JJ hh: mm: ss" est censé ê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 comme les suivantes:

Erreur de langue danois La conversion d'un type de données varchar en un type de données datetime a abouti à 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 triable "s" :

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

Il semble que vous ne pouvez utiliser que YYYYMMDDpour la date, et soit YYYY-MM-DDThh:mm:ss(avec des tirets, et oui, une partie Tentre la date et l'heure!) Ou YYYYMMDD HH:MM:SS(pas de tirets, pas de littéral de séparation) pour être vraiment indépendant de la langue ...
marc_s

1
@marc_s: Merci pour le commentaire. J'ai édité ma réponse pour mentionner le format ISO 8601 (qui comprend le littéral T comme vous l'avez mentionné).
Paul Williams

insérer dans les valeurs @TestLang (langdate) ('2012-06-18T10: 34: 09') est la meilleure réponse.
MERT DOĞAN

20

Management Studio crée des scripts comme:

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

8

vous devez l'ajouter comme

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

2

Pas besoin d'utiliser convert. Indiquez-la simplement comme une 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 .


1

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 qui contient votre date dans votre format.


1

Je rencontre un problème plus générique: obtenir des formats datetime différents (et pas nécessairement connus) et les insérer dans la colonne datetime. Je l'ai résolu en utilisant cette instruction, qui est finalement devenue une fonction scalaire (pertinente pour le style de date ODBC canonique, américain, ANSI et britannique \ franch - 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))) 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.