Ma table contient un champ de naissance qui a du type de données en tant que DateTime. Je veux obtenir tous les disques d'anniversaire aujourd'hui. Comment puis-je l'obtenir? P>
3 Réponses :
Essayez cette requête:
SELECT * FROM mytable
WHERE strftime('%m-%d', 'now') = strftime('%m-%d', birthday)
Quel est le type de données? Est-ce texte code>? Ou peut-être blob code>? Il serait utile que le Docs ait dit quoi utiliser pour sqlite3_bind_xxxx code>. Et je serais curieux de savoir si d'autres opérateurs, comme > = code>, fonctionnent comme prévu. Voir aussi Fonction de liaison SQLite dans la déclaration préparée .
SQLite a une très mauvaise aide pour stocker les dates. Vous pouvez utiliser la méthode suggérée par Nick D ci-dessus, mais que cette requête entraînera une analyse de la table complète, car les dates ne sont pas indexées correctement dans SQLite (en réalité, SQLite ne prend pas en charge les dates comme un type intégré). p>
Si vous voulez vraiment faire une requête rapide, vous devrez ajouter une colonne séparée (intégrale) pour stocker le jour de naissance (1-31) et joindre un index pour celui-ci dans la base de données. P>
Si vous voulez seulement comparer les dates, vous pouvez ajouter une colonne unique (entier) qui stockera la valeur UTC de date (mais cette astuce ne vous permettra pas de rechercher facilement des composants de date individuels). P>
bonne chance p>
Date ou DateTime serait stocké comme numérique (voir "2.2 Exemples de noms d'affinité" dans sqlite.org/dataType3.html ) comme une heure unix (voir la section "1.2 DataType de date et heure"). Stocker le jour et le mois est une optimisation possible, stockant une autre colonne entière est redondante.
Avoir un type de DateTime spécial a toujours semblé que des frais généraux inutiles, les entiers sont rapides, flexibles et utilisent moins d'espace. P>
Pour General DateTime Valeurs Utilisez UNIX EPOCH TIMESTAMPS. Facile à travailler avec, extrêmement flexible, ainsi que le fuseau horaire (et même calendrier!) Agnostique. (J'ai récemment écrit un article sur les utiliser, que je dois vraiment brancher ... a>) p>
Cela dit, si vous êtes seulement intéressé par les dates du calendrier grégorien, vous voudrez peut-être utiliser un grand nombre d'entiers dans le format suivant: yyyymmdd, par exemple 19761203. Pour votre utilisation particulière, vous pouvez même créer un entier à quatre chiffres comme MMDD. , Dites 1703 - Cela doit entraîner des sélections rapides! P>
Il semble que SQLite puisse stocker des dates comme une heure unix: sqlite.org/dataType3.html ( Voir "1.2 DataType de date et heure"). Donc, aucun espace gaspillé là-bas.
Quant au stockage de votre rendez-vous comme un entier comme YyymMdd, qu'en est-il des anniversaires qui ont des dates? Qu'en est-il des anniversaires du même mois? Il y a beaucoup d'opérations mod / div requises pour sortir chaque fragment de date. Il me semble que vous feriez mieux d'utiliser les outils intégrés intégrés (et optimisés et lisibles) de la base de données telles que la réponse de Nickd.