2009-03-05 11 views
5

Quel est le moyen le plus efficace pour calculer le dernier jour du trimestre COURANT?Calculer le dernier jour du trimestre COURANT

Exemple: étant donné la date 05/03/09, je veux retourner 31/03/09.

plate-forme est ColdFusion et SQL Server

+0

@Learning: Qu'est-ce que vous a fait penser que les besoins en question et balise [SQLServer]? * semble un peu perplexe * – Tomalak

+1

@Tomalak: parce qu'il est dit dans la question? :) – Learning

+0

Voulez-vous effectuer le dernier jour réel ou le dernier jour ouvrable du trimestre? –

Répondre

8
SELECT  DATEADD(qq, DATEDIFF(qq, - 1, '3/5/09'), - 1) 
3

Cela pourrait utiliser un refactoring, mais devrait faire passer l'idée de base.

<cffunction name="lastDayOfQuarter"> 
    <cfargument name="d" default="#now()#"> 
    <cfif month(d) lte 3> 
    <cfreturn createDate(year(d),03,31)> 
    </cfif> 
    <cfif month(d) lte 6> 
     <cfreturn createDate(year(d),06,30)> 
    </cfif> 
    <cfif month(d) lte 9> 
     <cfreturn createDate(year(d),9,30)> 
    </cfif> 
    <cfreturn createDate(year(d),12,31)> 
</cffunction> 
+0

lol @whoever était assez ignorant pour voter contre cela. – Tomalak

+0

+1 pour être efficace (ce qui est demandé), même si ce n'est pas forcément élégant. – Dane

0

Pour obtenir le trimestre à partir d'une date précise:

SELECT dateadd(dd,-1,dateadd(qq,1,DATEADD(qq, DATEDIFF(qq,0,<date here>), 0))) 

Ou si vous voulez dire le trimestre en cours:

SELECT dateadd(dd,-1,dateadd(qq,1,DATEADD(qq, DATEDIFF(qq,0,getdate()), 0))) 
4

Cette réponse utilise les fonctions intégrées trimestre et daysInMonth:

#createDate(year(now()), (quarter(now())*3), daysInMonth(createDate(year(now()), quarter(now())*3,1)))# 

Il pourrait être e Asier à lire si son éclaté un peu.


EDIT (@ Sam Fermier: Je pris la liberté de transformer votre suggestion en fonction des FC)

<cffunction name="LastOfQuarter" returntype="date" output="no" access="public"> 
    <cfargument name="d" type="date" required="no" default="#Now()#"> 

    <cfset d = CreateDate(Year(d), Quarter(d) * 3, 1)> 
    <cfreturn DateAdd("d", d, DaysInMonth(d) - 1)> 
</cffunction> 
+0

Merci! Belle fonction de recherche :) –

+0

J'ai pensé à poster ceci dans une réponse de mon cru. Mais essentiellement, cela aurait été une arnaque à bas prix de votre idée, alors j'ai décidé de ne pas y penser. ;-) – Tomalak

+0

@Sam Farmer: Suppression de votre edit () et retour à la version originale. Une variable locale est inutile, vraiment. :-) La fonction écrira à "arguments.d", ce qui ne fera pas de mal. – Tomalak

Questions connexes