Comment insérer une valeur datetime dans une base de données SQLite?


109

J'essaye d'insérer une valeur datetime dans une base de données SQLite . Cela semble être un succès, mais lorsque j'essaye de récupérer la valeur, il y a une erreur:

<Impossible de lire les données>

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éponses:


153

Le format dont vous avez besoin est:

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

ie aaaa-MM-jj HH: mm: ss

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


Comment classer par date avec de telles chaînes?
IgorGanapolsky

3
Lorsque vous formatez des dates comme celle-ci, l'ordre des dates et l'ordre lexical fonctionnent de la même manière. Par exemple, '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' à la fois sous forme de chaînes et de dates. Mais vous n'avez pas strictement besoin de vous en soucier car SQLite ORDER BY se chargera de la commande pour vous.
itowlson

7
Notez que vous ne pouvez pas comparer de manière fiable des dates avec une précision différente en utilisant un ordre lexical, 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

@itowlson Comment cela fonctionnera-t-il lorsque vous avez une application multilingue?
batmaci


17

Vous devez changer le format de la chaîne de date que vous fournissez afin de pouvoir l'insérer à l'aide de la fonction STRFTIME. Raison d'être, il n'y a pas d'option pour l'abréviation d'un 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: Fonctions de date et d'heure SQLite


Bien que non répertorié dans le tableau, la documentation indique également que vous pouvez ajouter «Z» ou des décalages tels que «-0400»
coolaj86

10

Utilisez CURRENT_TIMESTAMPquand vous en avez besoin, au lieu de OF NOW()(qui est MySQL)


1
cela fonctionne, une chose ne va pas. CURRENT_TIMESTAMP renvoie datetime sans UTC, savez-vous comment résoudre ce problème. Merci d'avance!
Ulug'bek Ro'zimboyev

8

Lisez ceci : 1.2 Dateet le meilleur type de données de type de données heure pour stocker la date et l'heure est:

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

Alors lisez cette page; il est préférable d'expliquer la date et l'heure SQLite. J'espère que cela vous aidera


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

0

Ce n'est peut-être pas la méthode la plus populaire ou la plus efficace, mais j'ai tendance à renoncer aux types de données forts dans SQLite car ils sont tous essentiellement vidés sous forme de chaînes de toute façon.

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


Ne le coupe pas pour les dates si par exemple vous vouliez trier par ce champ; vous vous retrouvez avec une comparaison de chaînes ...
G__
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.