Dans le cadre d’un projet de développement, vous pouvez être amené à enregistrer des horaires de réunions. En plus de la date, il sera nécessaire de stocker l’horaire. On pourra par exemple enregistrer l’heure de début et l’heure de fin. Ou bien l’heure de début et la durée en minutes. Une autre solution plus économe en termes de stockage est de considérer qu’il n’y a pas obligatoirement besoin d’une précision à la minute près. En pratique, un horaire de réunion n’est jamais fixé à 10h32 ou 14h04. Une précision avec des créneaux toutes les 5 minutes s’avère suffisante. Par ailleurs, en considérant qu’une réunion se déroule obligatoirement sur une seule journée, plus la réunion commence tard et moins sa durée maximale est grande. En tenant compte de ces deux critères, il devient possible d’utiliser un simple entier sur 2 octets pour stocker l’heure de début et la durée de réunion.
L’idée est de lister toutes les combinaisons possibles d’horaires et de durées sur une journée et d’associer à chacune de ces combinaisons un nombre qui servira de clef unique. On obtient ainsi les possibilités suivantes :
Heure de début | Durée en minutes | Clef |
00h00m | 5 | 0 |
00h00m | 10 | 1 |
00h00m | 15 | 2 |
… | … | … |
00h00m | 24 * 60 | 287 |
00h05m | 5 | 288 |
00h05m | 10 | 289 |
00h05m | 15 | 290 |
… | … | … |
00h05m | (24 * 60) – 5 | 574 |
00h10m | 5 | 575 |
00h10m | 10 | 576 |
00h10m | 15 | 577 |
… | … | … |
00h10m | (24 * 60) – 10 | 860 |
00h15m | 5 | 861 |
00h15m | 10 | 862 |
00h15m | 15 | 863 |
… | … | … |
00h15m | (24 * 60) – 15 | 1145 |
00h20m | 5 | 1146 |
… | … | … |
00h20m | (24 * 60) – 20 | 1429 |
00h25m | 5 | 1430 |
… | … | … |
23h50m | 5 | 41613 |
23h50m | 10 | 41614 |
23h55m | 5 | 41615 |
Pour calculer la clef à partir de n’importe quelle heure de début en minutes et de n’importe quelle durée en minutes, on utilisera la fonction suivante (ici en Python) :
# debut : heure de début en minutes
# duree : durée en minutes
# debut et duree doivent impérativement être des multiples entiers de la précision
# duree > 0
# debut + duree <= 24 * 60
def calc_clef(debut, duree):
# précision horaires et durée en minutes
precision = 5
# plus petit nombre unique associé
# ici on considère un entier 16 bits signé qui peut être négatif
# mettre min = 0 pour retrouver les exemples ci-dessus
min = -32768
# nb tranches dans une journée (24h)
n = (24 * 60) // precision
k = (debut // precision) + 1
# voir https://math.stackexchange.com/a/556810
r = (n * k) - ((k * (k + 1)) / 2)
offset = n - (duree // precision)
return min + r - offset + ((debut // precision) * 2)
Dans le contexte d’une utilisation avec une base de données SQL, on pourra pré-générer une table fixe qui contiendra toutes les combinaisons possibles avec comme clef unique le nombre calculé et les champs heure de début et durée. Puis, dans la table de stockage des réunions, un seul champ de type entier sur 16 bits suffira pour conserver l’heure de début et la durée de la réunion.