2009-12-19 3 views
90

J'essaie d'insérer une valeur datetime dans une base de données SQLite. Il semble être sucsessful mais lorsque je tente de récupérer la valeur il y a une erreur:Comment insérer une valeur datetime dans une base de données SQLite?

<Unable to read data>

Les instructions SQL sont:

create table myTable (name varchar(25), myDate DATETIME) 
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15') 

Répondre

119

Le format dont vous avez besoin est:

'2007-01-01 10:00:00' 

Par exemple, aaaa-MM-jj HH: mm: ss

Si possible, utilisez une requête paramétrée car cela vous évite de les détails de mise en forme.

+0

Comment un ordre par jour avec ces chaînes? –

+3

Lorsque vous formatez des dates comme celles-ci, la commande de date et la commande lexicale fonctionnent de la même manière. Par exemple. «2008-02-01»> «2007-02-01», «2008-01-02»> «2008-01-01» à la fois en tant que cordes et en tant que dates. Mais vous n'avez pas besoin de vous préoccuper de cela car SQLite ORDER BY se chargera de commander pour vous. – itowlson

+5

Notez que vous ne pouvez pas comparer de manière fiable des dates avec une précision différente en utilisant la commande lexicale, par exemple "SELECT '2007-01-02 10:00:00'> '2007-01-02 10:00';" renvoie 1 mais "SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" renvoie 0. – Shane

40

La façon de stocker les dates en SQLite est:

yyyy-mm-dd hh:mm:ss.xxxxxx 

SQLite a aussi des fonctions de date et l'heure que vous pouvez utiliser. Voir SQL As Understood By SQLite, Date And Time Functions.

+1

FYI, '.xxxxxx' ici dans la syntaxe de @ TorValamo =' .SSS' =% f dans la documentation de SQLite, c'est-à-dire en secondes fractionnaires. –

+2

DateTime.parse ('2016-05-28 14:27:00 -0300'). Strftime ('% Y-% m-% d% H:% M:% S') – rodvlopes

16

Vous devez changer le format de la chaîne de date que vous fournissez afin de pouvoir l'insérer en utilisant la fonction STRFTIME. Raison d'être, il n'y a pas d'option pour une abréviation de mois:

%d day of month: 00 
%f fractional seconds: SS.SSS 
%H hour: 00-24 
%j day of year: 001-366 
%J Julian day number 
%m month: 01-12 
%M minute: 00-59 
%s seconds since 1970-01-01 
%S seconds: 00-59 
%w day of week 0-6 with sunday==0 
%W week of year: 00-53 
%Y year: 0000-9999 
%% % 

L'alternative est de formater la date/heure dans un format déjà accepté:

  1. AAAA-MM-JJ
  2. AAAA MM-JJ HH: MM
  3. AAAA-MM-JJ HH: MM: SS
  4. AAAA-MM-JJ HH: MM: SS.SSS
  5. AAAA-MM-JJTHH: MM
  6. AAAA-MM-JJTHH: MM: SS
  7. AAAA-MM-JJTHH: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. maintenant

Référence: SQLite Date & Time functions

+0

Bien que non répertorié dans le tableau, le docs indiquent également que vous pouvez ajouter «Z» ou décalages tels que «-0400» – CoolAJ86

0

Cela peut ne pas être la méthode la plus populaire ou efficace, mais je tendance à renoncer à de fortes SQLite types de données sinc e ils sont tous essentiellement déversés en tant que chaînes de toute façon.

J'ai écrit un léger wrapper C# autour de la bibliothèque SQLite avant (lors de l'utilisation de SQLite avec C#, bien sûr) pour gérer les insertions et extractions de SQLite comme si je traitais des objets DateTime.

+0

Ne pas le couper pour les dates si par exemple vous vouliez trier par ce champ; vous vous retrouvez avec une comparaison de chaînes ... – Greg

+2

La comparaison de chaînes de dates fonctionne très bien avec l'ordre AAAA-MM-JJ. – dan04

5

Lecture This: 1.2 Date et temps Datatype meilleur type de données à jour du magasin et le temps est:

meilleur format TEXT est: yyyy-MM-dd HH:mm:ss

Puis lisez la page this; C'est mieux expliquer la date et l'heure dans SQLite. J'espère que cela vous aide

+3

Vous devriez envisager de répondre à la question, avec des liens qui soutiennent votre réponse, pas seulement un tas de liens –

5

Utilisez CURRENT_TIMESTAMP lorsque vous en avez besoin, au lieu de NOW() (qui est MySQL)

+1

cela est travaillé, une chose est fausse. CURRENT_TIMESTAMP renvoie datetime sans UTC, savez-vous comment résoudre ce problème. Merci d'avance! –

Questions connexes