2009-12-01 13 views
1

Est-il possible d'écrire une requête équivalente àSql sténographie Pour les dates

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 prochaine.

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

select * from log_table where dt = 'nov-27-2009':+1; 
+2

Quel fournisseur de base de données? –

Répondre

2

Je ne crois pas qu'il existe une méthode qui soit portable pour tous les SGBDR.

Une vérification dans l'une de mes références (SQL Cookbook) montre qu'aucun RDBMS ne résout le problème de la même manière. 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 à cette question dans SQLite, cependant, et SQL Cookbook ne répond pas SGBDR, donc je vais parler un peu ici. SQLite n'a pas de type de données date/heure; vous devez créer le vôtre en stockant toutes les données de date/heure comme TEXT et assurez-vous que votre application applique sa mise en forme. SQLite possède un ensemble de date/time conversion functions qui vous permet d'ajouter des dates/heures nominales tout en conservant les données sous forme de chaînes. Toutefois, si vous devez ajouter deux durées (HH: MM: SS), en fonction des données que vous avez stockées dans les colonnes de texte que vous traitez en tant que données date/heure, vous devrez write your own functions (recherche pour "Définition des fonctions utilisateur SQLite") et les joindre à 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, faites le moi savoir.

0

Pour MS SQL Server, consultez DATEPART.

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

Ceci est spécifique à SQL Server. La plupart des autres bases de données ont des fonctions équivalentes pour fonctionner aux dates. –

+1

Et l'exécution d'une fonction sur une colonne de base de données limitera généralement l'optimiseur de requêtes à l'aide de n'importe quel index sur cette colonne.(Les optimiseurs deviennent toujours plus intelligents, cela peut donc changer.Oracle permet de définir des index basés sur les fonctions pour y remédier.) –

0

Avec SQL Server, vous pouvez

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

Tant que vous faites affaire avec le type de données de date pour le type de données respectives, cela devrait fonctionner:

t.date_column + 1 

... Serais ajouter un jour à la date donnée. Mais je n'ai pas encore trouvé de db qui permette la conversion de type de données implicite en une date.

SELECT '12-10-2009' + 1 

... échouera sur SQL Server car SQL Server effectue uniquement la conversion implicite lors de la comparaison à 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

0

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