Ah, Jésus-Christ !

Résolu/Fermé
heliconius Messages postés 545 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 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 9 avril 2020 à 13:17
Bonjour,

Je sais que dans une BDD MySQL les dates (et dates/heure) sont enregistrées comme texte au format 'AAAA-MM-JJ HH:MN:SS'

Le cas ne s'était pas présenté jusqu'ici mais là, j'ai à saisir dans une table Personnes (idpers, nom, prenom, dnaiss, ddc, etc...) : Neferneferuaten Nefertiti, épouse royale d'Akhenaton, née vers 1370 av JC et décédée vers 1333 av JC.

Y a-t-il (j'en doute) un type particulier de date que j'ignore et qui accepterait les dates négatives ou y a-t-il une "bidouillle" possible pour gérer ce type de cas ?

A première vue et d'après moi, j'envisage la gestion comme suit :
1) les dates sont toutes au format positif ('AAAA-MM-JJ HH:MN:SS')
2) un champ supplémentaire (genre 'jc' qui serait égal à 1 ou à -1) ; JC=Jésus-Christ. Si ce champ est négatif la date est située avant JC ; si ce champ est positif, elle est située après JC.

Mais cette façon de faire me semble une bidouille/cataplasme mais (surtout quand la référence est Jésus-Christ) la gestion ne me semble pas très 'catholique'. Est-ce la bonne méthode ou y en a-t-il d'autres plus conventionnelles ?

Merci pour votre aide et vos réponses.

Configuration: Windows / Firefox 52.0

2 réponses

yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
8 déc. 2019 à 09:30
bonjour, pourquoi ne pas utiliser un champ numérique signé avec uniquement l'année?
2
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
8 avril 2020 à 22:25
Bonsoir,
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 !
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
Modifié le 9 avril 2020 à 09:32
pourquoi ne pas utiliser le champ numérique avec l'année uniquement dans le cas où la date précise est nulle?
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
9 avril 2020 à 13:17
C'est une idée. Il y a deux dates à gérer : naissance et décès donc deux champs date et deux champs numériques signés. Je vais voir. En tout cas, merci.
Je considère le sujet clos.
Merci à tous, bonne continuation.
0
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
0
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 +).
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
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".
0