Question

Est-il possible d'écrire une requête équivalente à

select * from log_table where dt >= 'nov-27-2009' and dt < 'nov-28-2009';

mais où vous pouvez spécifier seulement 1 jour et dire que vous voulez que les résultats pour cette journée jusqu'à la suivante.

Je fais juste ça, mais quelque chose de la forme:

select * from log_table where dt = 'nov-27-2009':+1;
Était-ce utile?

La solution

Je ne crois pas qu'il y ait une méthode qui est portable à tous les SGBDR.

Un chèque dans l'une de mes références ( SQL Cookbook ) montre que personne ne SGBDR résout le problème tout à fait de la même façon. Je recommande de vérifier le chapitre 8 de ce livre, qui couvre toutes les différentes méthodes pour DB2, Oracle, PostgreSQL, MySQL.

J'ai dû faire face à ce problème dans SQLite , bien que, et SQL Cookbook ne traite pas SGBDR, donc je vais parler un peu ici. SQLite n'a pas de date / heure type de données ; vous devez créer votre propre en stockant toutes les date / données en temps que TEXT et veiller à ce que votre application impose sa mise en forme. SQLite a un ensemble de Date / fonctions de conversion temps qui vous permettent d'ajouter des dates / heures nominale tout en maintenant les données sous forme de chaînes. Si vous devez ajouter deux durées (HH: MM: SS) à l'autre, bien que, sur la base de données que vous avez stockées dans des colonnes de texte que vous traitez des données de date / heure, vous devrez écrire vos propres fonctions (recherche de « Définition SQLite fonctions utilisateur ») et les attacher à la base de données lors de l'exécution via un appel à sqlite3_create_function(). Si vous voulez un exemple de certaines fonctions utilisateur qui ajoutent des valeurs de temps, laissez-moi savoir.

Autres conseils

Pour MS SQL Server, consultez DATEPART .

/* dy = Day of Year */
select * from log_table where datepart(dy, dt) = datepart(dy, '2009-nov-27');

Avec SQL Server, vous pourriez

   Select * From table
   Where dt >= DateAdd(day, DateDiff(day, 0, @ParamDate), 0)
      And dt < DateAdd(day, DateDiff(day, 0, @ParamDate), 1)

Tant que vous faites affaire avec le type de données de date pour le type de données respectives, ce qui suit fonctionnera:

t.date_column + 1

... va ajouter un jour à la date indiquée. Mais je dois encore trouver une db qui permet la conversion du type de données implicite dans une date.

SELECT '12-10-2009' + 1

... échouera sur SQL Server, car SQL Server effectue uniquement la conversion implicite lorsque l'on compare à une colonne de type de données datetime. Donc, vous devez utiliser:

SELECT CONVERT(DATETIME, '12-10-2009') + 1

Pour Oracle, vous devriez utiliser la fonction TO_DATE ; MySQL utiliserait quelque chose comme STR_TO_DATE , etc.

Avoir une colonne qui a juste la partie date (heure est 00: 00: 00.000) et vous pouvez ajouter une clause where: Où dt = '2009-11-27'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top