7
votes

Meilleure façon de stocker des valeurs d'intervalle de temps dans MySQL?

Un problème de stupide facile, mais je n'ai pas pu trouver une solution élégante. Je veux stocker des intervalles de temps dans une colonne MySQL, par exemple:

1:40 (pendant une heure, 40 minutes) 0:30 (30 minutes).

puis pour pouvoir exécuter des requêtes en lesomant. À l'heure actuelle, je les stocke comme des valeurs int (1.40), mais je dois faire l'ajout manuellement (sauf si je manque un moyen plus facile).

Le type de colonne temporel ne stocke que jusqu'à 900 heures (à propos de, je pense), c'est donc (presque) inutile pour moi puisque je suive des centaines de milliers d'heures (je stocke un champ avec une somme de nombreuses entrées différentes ).

Merci!


0 commentaires

5 Réponses :


10
votes

Stocker juste les minutes, donc 1:40 est stocké comme étant 100. Cela facilite l'addition: 100 + 30 = 130. Lorsque vous affichez, faites les calculs à convertir en heures: minutes. 130 minutes -> 2:10.


2 commentaires

J'ai fait une chose similaire dans l'une de mes applications, mais je stocke les secondes à la place afin que ma somme ne perd pas toutes ces minutes partielles.


Oui, si vous avez besoin de suivre des secondes, alors faites des secondes. Mais la question ne pose que quelques minutes environ.



7
votes

Je les stockerais simplement dans un champ INT sous forme de secondes ou minutes (ou quelle que soit la valeur de temps la plus basse avec laquelle vous travaillez).

Par exemple, vous souhaitez stocker la valeur horaire suivante de 1 heure 34 min 25 secondes:

C'est 5665 secondes. Il suffit donc de stocker la valeur comme 5665 dans un champ Int

Plus tard, disons que vous souhaitez stocker la valeur de l'heure 56 min 7 secondes:

C'est 3367 secondes.

Somme tout plus tard: 5665 + 3367 = 9032 secondes

Convertissez cela à des heures, minutes, secondes, vous obtenez 2 heures 30 minutes 32 secondes. Oui, vous devez faire les mathématiques pour faire la conversion, mais c'est un calcul très simple et ce n'est pas du tout à plus intensif de la machine puisque vous ne le faites qu'une fois, soit avant de stocker l'int, soit une fois, après avoir récupéré l'int. < / p>


0 commentaires

5
votes

Vous pouvez certainement utiliser un champ INT pour cela, surtout que mysql fournit le date_add et date_sub fonctions pour l'utilisation d'unités de temps entier aux côtés Date et DateTime Types à la date ARTHMETIC.

Par exemple, si vous avez une colonne DateTime EventDationTime et que vous avez une colonne de durée DuréeMinutes Vous pouvez calculer la date de date finale en utilisant: xxx


0 commentaires

0
votes

Si vous voulez les stocker comme heures et que vous gardez ainsi le nombre d'entier petit, vous pouvez prendre le nombre de minutes et diviser par 60.

SO 1:40 devient 100/60 = 1,66,: 30 devient 30 / 60 = .5. Maintenant, vous pouvez simplement les ajouter normalement: P>

   .16 * 60 = 10


3 commentaires

Lors de la sauvegarde des heures en tant que valeurs flottantes, vous pourriez rencontrer des erreurs d'arrondi, e. g. 100 minutes sont pas exactement 1,66 heure. Avec d'autres opérations, votre erreur est plus grande.


Pourquoi flotte? Stockez simplement les secondes, si vous voulez les secondes. Même 32 bits suffisent pour cela et vous n'aurez pas d'erreurs d'arrondi. Pour les millisecondes, il existe des types INT de 64 bits (Bigint pour la plupart des bases de données SQL).


Pas secondes, minutes. Et OP demandait une façon de stocker des quantités temporelles avec des heures en tant que base (les minutes seraient la fraction de base). Ne vous souvenez même pas pourquoi les flotteurs semblaient idéaux.



1
votes

Je sais que ce n'est pas le genre d'intervalle de temps dont vous parlez, quand je suis quand j'ai cherché autour de là, il s'agit de la seule question pertinente de la question que j'ai trouvée, afin d'aider d'autres âmes perdues comme moi, je pensais poster quoi Je fais maintenant.

Je stocke une longueur d'abonnement, qui plutôt que des valeurs précises telles que "Nombre de secondes" ou même minutes sont soit jours ou mois . Donc, dans mon cas, j'ai une "durée" int et une "durée_unit" d'énormes ("jours", "mois").

Donc, pour un abonnement "de 6 mois" plutôt que d'essayer de calculer le nombre de minutes dans un cours de 6 mois (qui varie selon les 6 mois dont vous parlez), je stocke simplement "6" et "mois".

avec la méthode MKTime () de PHP, il est facile et plus précis de calculer des intervalles de temps de +6 mois.


0 commentaires