Bonjour,
@Artemus24 la syntaxe proposée par SQL pro est correcte ou presque
puisqu'il ne manquait finalement que d'un Casting soit explicite CAST, soit raccourci DATE et bien sûr d'un FROM RDB$DATABASE (spécifique à Firebird comme Interbase)
1 2 3
| SELECT DATEADD(1 MONTH DATE '31.01.2017') FROM RDB$DATABASE;
SELECT DATEADD(MONTH,1, DATE '31.01.2017') FROM RDB$DATABASE;
SELECT DATEADD(MONTH,1, CAST('31.01.2017' AS DATE)) FROM RDB$DATABASE; |
feront toutes 3 la même chose et le résultat en sera 28.02.2017. Par contre, il est vrai qu'il faut se méfier d'un calcul pareil car
SELECT DATEADD(1 MONTH DATE '28.02.2017') FROM RDB$DATABASE ne donnera pas la fin du mois de mars mais 28.03.2017 et là, effectivement, cela poserait problème !
Vous noterez cependant que, de toute façon, le code que je propose travaille toujours sur le premier du mois 
DATEADD((EXTRACT(DAY FROM :d)*-1+1) DAY TO :d)
Que la norme SQL interdise explicitement l'ajout ou non de mois ne change rien au fait que cela fonctionnera avec Firebird. Je pense que toutes les SGBD ont quelques écarts (ou idiosyncrasies ?) avec la norme et je ne jetterai pas la pierre à Firebird pour ça. L'important est surtout de savoir comment est traité cette opération.
Partager