En utilisant les fonctions standard de mysql, il existe un moyen d'écrire une requête qui retournera une liste de jours entre deux dates.
Par exemple, étant donné le 2009-01-01 et le 2009-01-13, il renverrait une table à une colonne avec les valeurs:
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
Edit: Il semble que je n'ai pas été clair. Je veux GÉNÉRER cette liste. J'ai des valeurs stockées dans la base de données (par date / heure) mais je veux qu'elles soient agrégées sur une jointure externe gauche à une liste de dates comme ci-dessus (j'attends null du côté droit de certaines de cette jointure pendant quelques jours et je vais gérer cela ).
mysql
sql
date
gaps-and-islands
Gilgad
la source
la source
Réponses:
J'utiliserais cette procédure stockée pour générer les intervalles dont vous avez besoin dans la table temporaire nommée time_intervals , puis JOIN et agréger votre table de données avec la table temp time_intervals .
La procédure peut générer des intervalles de tous les types différents que vous y voyez spécifiés:
Exemple de scénario de données similaire au bas de cet article , où j'ai créé une fonction similaire pour SQL Server.
la source
Pour MSSQL, vous pouvez utiliser ceci. C'est TRÈS rapide.
Vous pouvez encapsuler cela dans une fonction de table ou un processus stocké et analyser les dates de début et de fin en tant que variables.
la source
Nous avons eu un problème similaire avec les rapports BIRT en ce sens que nous voulions signaler les jours qui n'avaient pas de données. Comme il n'y avait pas d'entrées pour ces dates, la solution la plus simple pour nous était de créer une table simple qui stockait toutes les dates et de l'utiliser pour obtenir des plages ou une jointure pour obtenir des valeurs nulles pour cette date.
Nous avons un travail qui se déroule tous les mois pour nous assurer que le tableau est rempli 5 ans dans le futur. La table est créée ainsi:
Il existe sans aucun doute des moyens magiques et délicats de le faire avec différents SGBD, mais nous optons toujours pour la solution la plus simple. Les exigences de stockage pour la table sont minimes et cela rend les requêtes tellement plus simples et portables. Ce type de solution est presque toujours meilleur du point de vue des performances, car il ne nécessite pas de calculs par ligne sur les données.
L'autre option (et nous l'avons déjà utilisée) est de s'assurer qu'il y a une entrée dans le tableau pour chaque date. Nous avons balayé le tableau périodiquement et ajouté zéro entrée pour les dates et / ou heures qui n'existaient pas. Cela peut ne pas être une option dans votre cas, cela dépend des données stockées.
Si vous pensez vraiment qu'il est difficile de maintenir la
all_dates
table remplie, une procédure stockée est la voie à suivre qui renverra un ensemble de données contenant ces dates. Ce sera certainement plus lent car vous devez calculer la plage à chaque fois qu'elle est appelée plutôt que de simplement extraire des données précalculées d'une table.Mais, pour être honnête, vous pouvez remplir le tableau pendant 1000 ans sans aucun problème sérieux de stockage de données - 365000 dates de 16 octets (par exemple) plus un index dupliquant la date plus 20% de frais généraux pour la sécurité, j'estimerais approximativement à environ 14M [365 000 * 16 * 2 * 1,2 = 14 016 000 octets]), une table minuscule dans le schéma des choses.
la source
Vous pouvez utiliser les variables utilisateur de MySQL comme ceci:
@num vaut -1 car vous y ajoutez la première fois que vous l'utilisez. De plus, vous ne pouvez pas utiliser "HAVING date_sequence" car cela fait que la variable utilisateur s'incrémente deux fois pour chaque ligne.
la source
En empruntant une idée à cette réponse, vous pouvez configurer une table avec 0 à 9 et l'utiliser pour générer votre liste de dates.
Cela vous permettra de générer une liste de jusqu'à 1000 dates. Si vous avez besoin d'augmenter votre taille, vous pouvez ajouter une autre jointure croisée à la requête interne.
la source
date
; ne résulte PAS de cette partie.Pour Access (ou tout autre langage SQL)
Créez une table qui a 2 champs, nous appellerons cette table
tempRunDates
:--Fields
fromDate
ettoDate
--Ensuite, insérez seulement 1 enregistrement, qui a la date de début et la date de fin.
Créez une autre table: -
Time_Day_Ref
Importez une liste de dates (créer une liste dans Excel est facile) dans cette table.
- Le nom du champ dans mon cas est
Greg_Dt
, pour la date grégorienne- J'ai créé ma liste du 1er janvier 2009 au 1er janvier 2020.
Exécutez la requête:
Facile!
la source
En règle générale, on utiliserait une table de nombres auxiliaires que vous gardez habituellement à cette fin, avec quelques variations à ce sujet:
J'ai vu des variations avec des fonctions table, etc.
Vous pouvez également conserver une liste permanente des dates. Nous avons cela dans notre entrepôt de données ainsi qu'une liste d'heures de la journée.
la source
Eh bien, comment trouver des dates entre deux dates données dans le serveur SQL est expliqué sur http://ektaraval.blogspot.com/2010/09/writing-recursive-query-to-find-out-all.html
la source
la source
Solution élégante utilisant la nouvelle fonctionnalité récursive (Common Table Expressions) dans MariaDB> = 10.3 et MySQL> = 8.0.
Ce qui précède renvoie un tableau des dates entre '2019-01-01' et '2019-04-30'.
la source
Nous l'avons utilisé dans notre système HRMS, vous le trouverez utile
la source
Cette solution fonctionne avec MySQL 5.0
Créer une table -
mytable
.Le schéma n'a pas d'importance. Ce qui compte, c'est le nombre de lignes qu'il contient.
Ainsi, vous ne pouvez conserver qu'une seule colonne de type INT avec 10 lignes, valeurs - 1 à 10.
SQL:
Limitation: le nombre maximum de dates renvoyées par la requête ci-dessus sera
(rows in mytable)*(rows in mytable) = 10*10 = 100.
Vous pouvez augmenter cette plage en modifiant la partie du formulaire en SQL:
from mytable x, mytable y, mytable z
So, the range be
10*10*10 =1000
and so on.la source
Créez une procédure stockée qui prend deux paramètres a_begin et a_end. Créez une table temporaire à l'intérieur de celle-ci appelée t, déclarez une variable d, affectez a_begin à d et exécutez une
WHILE
boucleINSERT
d dans t et appelez laADDDATE
fonction pour incrémenter la valeur d. EnfinSELECT * FROM t
.la source
J'utiliserais quelque chose de similaire à ceci:
Ensuite, la
@HOLDER
table Variable contient toutes les dates incrémentées par jour entre ces deux dates, prêtes à être jointes à votre guise.la source
Je me bats avec ça depuis un bon moment. Comme il s'agit du premier succès sur Google lorsque j'ai cherché la solution, permettez-moi de poster où je suis arrivé jusqu'à présent.
Remplacez
[yourTable]
par une table de votre base de données. L'astuce est que le nombre de lignes dans le tableau que vous sélectionnez doit être> = le nombre de dates que vous souhaitez renvoyer. J'ai essayé d'utiliser l'espace réservé de table DUAL, mais il ne renverrait qu'une seule ligne.la source
Ici, ajoutez d'abord un jour à la date de fin actuelle, ce sera le 28/02/2011 00:00:00, puis vous soustrayez une seconde pour obtenir la date de fin 27/02/2011 23:59:59. En faisant cela, vous pouvez obtenir toutes les dates entre les intervalles donnés.
sortie:
2011/02/25
2011/02/26
2011/02/27
la source
cette procédure insérera toutes les dates du début de l'année jusqu'à maintenant, remplacez simplement les jours du «début» et de la «fin», et vous êtes prêt à partir!
la source
IF a=365 THEN
affectée par les années bissextiles?150
à la ligne 9? Ce code est une "réponse pat" sans grande explication réelle.J'avais besoin d'une liste avec tous les mois entre 2 dates pour les statistiques. Les 2 dates sont les dates de début et de fin d'un abonnement. Ainsi, la liste montre tous les mois et le nombre d'abonnements par mois.
MYSQL
la source
Vous pouvez utiliser ceci
la source
j'utilise
Server version: 5.7.11-log MySQL Community Server (GPL)
Maintenant, nous allons résoudre cela de manière simple.
J'ai créé une table nommée "datetable"
maintenant, nous verrons les enregistrements insérés à l'intérieur.
et ici notre requête pour récupérer les enregistrements dans deux dates plutôt que ces dates.
espérons que cela aiderait beaucoup d’entre eux.
la source