"calculs conditionnels de dates" dans une requête (ou autre...)?

J’apprends depuis peu à utiliser Base dans LibreOffice.
Dans LibreOffice Calc :
je sais calculer les âges au format “ans et mois” avec certaines conditions :
si “Y2” = Date Décès, “X2” = Date Naissance

1 - je demande le calcul de l’âge à condition que la date de naissance soit renseignée
et qu’il n’y a pas de date de décès ; sinon la cellule doit rester vide :
=SI(Y2>1;" “;SI(X2>1;ANNEE(AUJOURDHUI()-X2)-1900&” ans “&MOIS(AUJOURDHUI()+1-X2)-1&” mois "))

2 - je demande le calcul de l’âge au moment du décès à condition que la date de décès soit renseignée
et que la date de naissance soit renseignée ; sinon la cellule doit rester vide :

=SI(ESTVIDE(Y2);" “;SI(X2>1;ANNEE(Y2-X2)-1900&” ans “&MOIS(Y2+1-X2)-1&” mois "))

Ma question : comment effectuer ces 2 “calculs conditionnels de dates” dans une requête (ou autre…) de LibreOffice Base ?

Bonjour

La syntaxe sera différente selon le “moteur” de base utilisé…

Avec Hsqldb (voir Base avec calcul de l’âge.odb):

SELECT "DateNaissance", "DateDécès",
CASE 
	WHEN "DateDécès" IS NULL THEN 
		CASE
			WHEN Month(CURRENT_DATE) < month("DateNaissance") or ( Month(CURRENT_DATE) = Month("DateNaissance") and day(CURRENT_DATE)<day("DateNaissance") )   THEN
		      CAST((year(CURRENT_DATE) - year("DateNaissance") -1) AS VARCHAR) || ' ans'
			ELSE
		      CAST((year(CURRENT_DATE) - year("DateNaissance") ) AS VARCHAR) || ' ans'
		END
	ELSE 
		CASE
			WHEN Month("DateDécès") < month("DateNaissance") or ( Month("DateDécès") = Month("DateNaissance") and day("DateDécès")<day("DateNaissance") )   THEN
		      CAST((year("DateDécès") - year("DateNaissance") -1) AS VARCHAR) || ' ans'
			ELSE
		      CAST((year("DateDécès") - year("DateNaissance") ) AS VARCHAR) || ' ans'
		END
END as "Age"

from "Table1"

Avec Firebird (voir CalculDateFB.odb):

SELECT "Nom", "DateNaissance", "DateDécès", 
CASE 
	WHEN "DateDécès" IS NULL THEN
		CASE
		WHEN extract(Month from CURRENT_DATE) < "mois" or 
		    ( extract(Month from CURRENT_DATE) = "mois" and extract(day from CURRENT_DATE)<"jour" )   THEN
		      datediff(year, "DateNaissance", CURRENT_DATE) -1
		ELSE
	      datediff(year, "DateNaissance", CURRENT_DATE) 
		END
	ELSE 
		CASE
		WHEN extract(Month from "DateDécès") < "mois" or 
		    ( extract(Month from "DateDécès") = "mois" and extract(day from  "DateDécès")<"jour" )   THEN
		      datediff(year, "DateNaissance", "DateDécès") -1
		ELSE
	      datediff(year, "DateNaissance", "DateDécès") 
		END
END as "Age"

from "VuePourAge"

Pour alléger la requête j’ai créé une vue “VuePourAge” dont le SQL est :

SELECT "ID_Table", "Nom", "DateNaissance", "DateDécès", EXTRACT( DAY FROM "DateNaissance" ) "jour", EXTRACT( MONTH FROM "DateNaissance" ) "mois", EXTRACT( YEAR FROM "DateNaissance" ) "an" FROM "Table1"

Cordialement

Tout d’abord, merci pour votre réponse très rapide.
Je suis retraité et j’ai, parmi d’autres, ce passe temps : continuer d’utiliser les outils bureautiques !
Dans ma question j’ai omis de préciser la version que j’utilise : LibreOffice 6.4.1.2 (x64), sous Windows 10.
Pour “Base”, je suis sous environnement d’exécution Java, Oracle version 1.8.0_241.
J’avais téléchargé,installé et configuré HSQLDB dans “Base” d’après l’article “POUR EN FINIR AVEC LE MODE INTÉGRÉ”
dont l’auteur est Jean-François Nifenecker
texte du lien
Mais je n’ai pas été capable de m’en servir : perte systématique des tables…
J’ai téléchargé vos 2 fichiers joints que j’ai pu ouvrir sans difficultés.
Toutefois, je m’aperçois qu’il me faudra me plonger résolument et sérieusement dans la création et l’édition en mode SQL…
A première vue, vous m’apportez les réponses à ma question, même s’il me faudra phosphorer pour afficher un résultat d’âge = 69 ans 6 mois (c’est mon âge).
Encore merci, j’en ai profité pour lire nombre de questions/réponses sur Ask LibrOffice.org. Je ne manquerai pas d’utiliser ce wiki dès que de besoin.

Merci pour le “retour”.

@Rosier a écrit:

Je ne manquerai pas d’utiliser ce wiki dès que de besoin.

Alors je me permets un conseil d’utilisation : nous réservons la fonction Ajouter une réponse… aux réponses apportées. Pour le reste nous recommandons d’utiliser l’ajout de commentaires, voire l’édition de la question pour y ajouter d’éventuelles précisions.

Cordialement