Ah, Jésus-Christ !
Résolu/Fermé
heliconius
Messages postés
539
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 juin 2023
-
7 déc. 2019 à 23:21
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 9 avril 2020 à 13:17
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 9 avril 2020 à 13:17
2 réponses
yg_be
Messages postés
23399
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 décembre 2024
Ambassadeur
1 556
8 déc. 2019 à 09:30
8 déc. 2019 à 09:30
bonjour, pourquoi ne pas utiliser un champ numérique signé avec uniquement l'année?
Salut,
" les dates (et dates/heure) sont enregistrées comme texte au format 'AAAA-MM-JJ HH:MN:SS' "
si on veut on choisit le format en fait, rien n'empêche d'ailleurs de faire soi même son propre format...
Le seul inconvénient c'est qu'on ne pourra pas utiliser les fonctions du lanagage dédiées au calculs de dates.
Ce qui est souvent utilisé c'est le Timestamp Unix car souvent plus pratique pour le calcul que de passer en base 12 ou 24 (jours)et 60(minutes, secondes).
En effet ce format de date peut-être précis à la seconde et utilise une base 10(décimale comme toute notre arithmétique):
https://fr.wikipedia.org/wiki/Heure_Unix
à priori rien n'empêche qu'il soit négatif. En se basant sur le calendrier grégorien il suffit de faire la soustraction de secondes entre les 2 dates.
"2) un champ supplémentaire" Plutôt lourd (développement plus compliqué pour performances moindres)et contraire à l'analyse de BDD puisque ces deux informations vont automatiquement ensemble il est possible de les regrouper en 1.
La soustraction suivante vous donnera un entier négatif en secondes que vous pouvez ensuite convertir en date:
vers 1370 av JC et décédée vers 1333 av JC (exprimé en secondes depuis l'an 0)
-
1er janvier 1970 00:00:00 (en secondes depuis l'an 0)
= différence entre les 2 dates en Secondes*-1(multipliée par -1 pour indiquer que la date est antérieure au 0 du timestamp Unix)
Avec ce système on laisse tomber Jésus pour Linus Torvalds, ce qui est bien mieux car ce dernier existe et l'autre n'a aucune réalité historique.
On garde aussi les fonctions du langage de manipulation des dates:
https://sql.sh/fonctions/timestamp
" les dates (et dates/heure) sont enregistrées comme texte au format 'AAAA-MM-JJ HH:MN:SS' "
si on veut on choisit le format en fait, rien n'empêche d'ailleurs de faire soi même son propre format...
Le seul inconvénient c'est qu'on ne pourra pas utiliser les fonctions du lanagage dédiées au calculs de dates.
Ce qui est souvent utilisé c'est le Timestamp Unix car souvent plus pratique pour le calcul que de passer en base 12 ou 24 (jours)et 60(minutes, secondes).
En effet ce format de date peut-être précis à la seconde et utilise une base 10(décimale comme toute notre arithmétique):
https://fr.wikipedia.org/wiki/Heure_Unix
à priori rien n'empêche qu'il soit négatif. En se basant sur le calendrier grégorien il suffit de faire la soustraction de secondes entre les 2 dates.
"2) un champ supplémentaire" Plutôt lourd (développement plus compliqué pour performances moindres)et contraire à l'analyse de BDD puisque ces deux informations vont automatiquement ensemble il est possible de les regrouper en 1.
La soustraction suivante vous donnera un entier négatif en secondes que vous pouvez ensuite convertir en date:
vers 1370 av JC et décédée vers 1333 av JC (exprimé en secondes depuis l'an 0)
-
1er janvier 1970 00:00:00 (en secondes depuis l'an 0)
= différence entre les 2 dates en Secondes*-1(multipliée par -1 pour indiquer que la date est antérieure au 0 du timestamp Unix)
Avec ce système on laisse tomber Jésus pour Linus Torvalds, ce qui est bien mieux car ce dernier existe et l'autre n'a aucune réalité historique.
On garde aussi les fonctions du langage de manipulation des dates:
https://sql.sh/fonctions/timestamp
je veux dire de convertir toutes les dates en secondes depuis la date UNIX(TIMESTAMP) et de passer le champ en entier comme type de variable.
Tout doit être calculé sur la base du 1er Janvier 1970 ce qui peut être fait sur la base existante sans trop de bobos...
La solution d'ajouter un élément +/- pour avant et après JC peut ainsi être évitée et surtout de ne pas avoir à ajouter un champ dans la table (ce qui est lourd).
Il faudra par contre appliquer une conversion lors de l'extraction/affichage de ces valeurs pour en faire des dates lisibles 'humainement' à partir de la valeur entière(- ou +).
Tout doit être calculé sur la base du 1er Janvier 1970 ce qui peut être fait sur la base existante sans trop de bobos...
La solution d'ajouter un élément +/- pour avant et après JC peut ainsi être évitée et surtout de ne pas avoir à ajouter un champ dans la table (ce qui est lourd).
Il faudra par contre appliquer une conversion lors de l'extraction/affichage de ces valeurs pour en faire des dates lisibles 'humainement' à partir de la valeur entière(- ou +).
heliconius
Messages postés
539
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 juin 2023
139
11 déc. 2019 à 12:10
11 déc. 2019 à 12:10
OK. Le timestamp d'UNIX a pour base le 01/01/1970 ! Jules César est né le 13/07/100 av JC (Jésus-Christ et non lui-même :-). Comment transcrirais-tu ça ? Et encore je ne te parle pas des égyptiens -1300 ou des chinois -5000 av JC ! Bonjour le nombre de secondes ! En plus, quand la date est approximative (vers 2500 av JC) sans mois ni jour, comment convertir ? Une fonction de conversion timestamp -> JJ/MM/AAAA (+ ou -) donnera toujours JJ/MM/AAAA. Si la date est précise, ça ira mais si elle est approximative, ça ne traduira pas le "vers".
8 avril 2020 à 22:25
je n'ai pas que Nefertiti à saisir. Il y a aussi des personnes telles que Jackie Evancho née le 09/04/2000.
Le nombre de personnes nées après JC est beaucoup plus important que les autres
Le nombre de personnes dont les {jour, mois et annéee} de naissance et décès sont connus représente la majeure partie de la table. Il n'y a que quelques personnes (soit environ 0,5%) pour lesquelles je ne connais ni le jour ni le mois et dont l'année est approximative.
Il y a bien une solution : que des champs numériques et numériques signés pour :
4 champs numériques : jn, mn, an (signé), prec pour la naissance et
4 champs numériques : jd, md, ad (signé), prec pour le décès
(prec = précision. 1=date précise, 0=date approximative --vers -1370 avt JC--)
Mais 8 champs pour ne gérer que deux dates, c'est quand même un peu lourd !
Modifié le 9 avril 2020 à 09:32
9 avril 2020 à 13:17
Je considère le sujet clos.
Merci à tous, bonne continuation.