IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQLite Discussion :

Comparaison de date en secondes depuis Epoch


Sujet :

SQLite

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut Comparaison de date en secondes depuis Epoch
    Bonjour,

    j'ai une colonne qui contient des dates au format iso-8601.
    lorsque je tente de comparer ces dates converties en secondes depuis Epoch à la date du jour en secondes depuis Epoch aussi ,
    la requête afiche tous les enregistrements de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sqlite> select count(*) from 'maTable';
    62        
    sqlite> select count(*) from 'matable' where strftime('%s',champDate) >= strftime('%s','now') -60*60;
    62
    j'ai trouvé sur le net, que je peux dire à sqlite que ce sont des nombres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sqlite> select count(*) from 'maTable' where cast(strftime('%s',champDate) as integer) >= cast(strftime('%s','now') -2*60*60 as integer);
    3
    peut-être que je m'enquiquine pour rien, je pourrais passer par datetime(champDate,'localtime') et datetime('now','localtime','-1 hour').

    sauriez-vous m'expliquer ce qu'il se passe ?

    par avance, merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 097
    Points
    1 097
    Par défaut
    Bonjour,

    Est-ce que tes dates sont au format full ISO ou générées par SQLITE (format ISO limité (pas de time zone et pas de séparateur date/heure)?

    Dans le premier cas il te faudra passer par une traduction vers le format SQLITE dans le second cas, tu peux faire immédiatement ta comparaison

    Dans tous les cas, le format ISO te permettra des comparaisons sans passer par le format UNIX.

    te donne
    2016-03-07 13:53:36
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select datetime('1977-04-22T01:00:00-05:00', 'localtime')
    te donne
    1977-04-22 08:00:00
    En jouant avec les modificateurs tu pourra faire toutes les comparaisons voulues (à la seconde près)

    Pour le reste un certain nombre de tests (que je n'ai pas fait) devrait également vérifier quelle est la meilleure méthode en terme de temps de réponse.

    Cordialement

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ça ne répond pas exactement à mon interrogation :
    pourquoi sqlite ne reconnait-il pas des nombres issus d'une conversion date -> secondes en tant que nombres ?
    pourquoi la comparaison n'opère-t-elle pas sur ces nombres ?
    pourquoi ?

    cependant, tu me confortes dans l'idée qu'il est plus imple d'utiliser datetime(). merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 097
    Points
    1 097
    Par défaut
    Je n'avais pas vu la question de cette façon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select typeof(strftime('%s','now')),typeof( strftime('%s','now') - 1)
    donne
    text, integer
    Cependant lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select strftime('%s','now')> strftime('%s','now') - 1  , strftime('%s','now')< strftime('%s','now') - 1, 'a' < 'b'
    j'obtiens bien
    1, 0, 1
    soit
    Vrai/Faux/vrai
    ce qui me semble bien démonter que SQLITE fait bien le traitement de cast de lui même. J'ai souvent constaté ce comportement c'est à dire qu'il m'a plus souvent forcer un résultat à être considéré comme une chaîne alors que SQLITE s'obstine à considérer une valeur non caractérisée composée de chiffres comme un nombre. Voir cette partie du site de SQLITE pour comprendre ce type de comportement.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ça reste bizarre que sqlite prenne un nombre pour du texte.
    on ne peut pas tout avoir : un faible typage/typage dynamique et l'infaillibilité !

    c'est pas encore très clair, je vais lire cette page avec la plus grande attention.

    merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par N_BaH Voir le message
    ça reste bizarre que sqlite prenne un nombre pour du texte.
    et vice-versa, je viens de comprendre la raison d'une saisie de numéro de téléphone à la mode France sans espace (donc 0xxxxxxxxx) ne restituant pas ensuite le 0 non significatif
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un nombre de secondes depuis 1977 en une date
    Par timbrochier dans le forum Général Java
    Réponses: 3
    Dernier message: 15/04/2015, 12h36
  2. Script de compteur de jours, heures, minutes, secondes depuis une date
    Par Dsphinx dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/05/2013, 10h37
  3. [PHP 5.0] Convertir un nombre de seconde depuis 1970 en date
    Par johnson95 dans le forum Langage
    Réponses: 3
    Dernier message: 07/07/2009, 21h43
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 15h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo