¿Cómo trabajo con trimestres (fechas trimestrales) en ASP.Net usando VB.Net 2.0?
Pregunta
Yo sé eso Sql Server tiene algunos prácticos informes trimestrales cosas, pero ¿qué pasa con el nativo .Net? Fecha y hora ¿objeto?¿Cuál es la mejor manera de sumar, restar y recorrer cuartos?
Es una cosa mala™ para utilizar el VB específico FechaAñadir() ¿función?p.ej.:
Dim nextQuarter As DateTime = DateAdd(DateInterval.Quarter, 1, DateTime.Now)
Editar:Ampliando la función de @bslorence:
Public Shared Function AddQuarters(ByVal originalDate As DateTime, ByVal quarters As Integer) As Datetime
Return originalDate.AddMonths(quarters * 3)
End Function
Ampliando la función de @Matt:
Public Shared Function GetQuarter(ByVal fromDate As DateTime) As Integer
Return ((fromDate.Month - 1) \ 3) + 1
End Function
Editar:Aquí hay un par de funciones más que fueron útiles:
Public Shared Function GetFirstDayOfQuarter(ByVal originalDate As DateTime) As DateTime
Return AddQuarters(New DateTime(originalDate.Year, 1, 1), GetQuarter(originalDate) - 1)
End Function
Public Shared Function GetLastDayOfQuarter(ByVal originalDate As DateTime) As DateTime
Return AddQuarters(New DateTime(originalDate.Year, 1, 1), GetQuarter(originalDate)).AddDays(-1)
End Function
Solución
Sé que puedes calcular el cuarto de una fecha así:
Dim quarter As Integer = (someDate.Month - 1) \ 3 + 1
Si está utilizando Visual Studio 2008, puede intentar incorporar funciones adicionales a la clase DateTime echando un vistazo a Métodos de extensión.
Otros consejos
Qué tal esto:
Dim nextQuarter As DateTime = DateTime.Now.AddMonths(3);
Una cosa para recordar es que no todas las empresas finalizan sus trimestres el último día de un mes.
Public Function GetLastQuarterStart() As Date
GetLastQuarterStart = DateAdd(DateInterval.Quarter, -1, DateTime.Now).ToString("MM/01/yyyy")
End Function
Public Function GetLastQuarterEnd() As Date
Dim LastQuarterStart As Date = DateAdd(DateInterval.Quarter, -1, DateTime.Now).ToString("MM/01/yyyy")
Dim MM As String = LastQuarterStart.Month
Dim DD As Integer = 0
Dim YYYY As String = LastQuarterStart.Year
Select Case MM
Case "01", "03", "05", "07", "08", "10", "12"
DD = 31
Case "02"
Select Case YYYY
Case "2012", "2016", "2020", "2024", "2028", "2032"
DD = 29
Case Else
DD = 28
End Select
Case Else
DD = 30
End Select
Dim LastQuarterEnd As Date = DateAdd(DateInterval.Month, 2, LastQuarterStart)
MM = LastQuarterEnd.Month
YYYY = LastQuarterEnd.Year
Return String.Format("{0}/{1}/{2}", MM, DD, YYYY)
End Function
Ampliando la respuesta de Matt Blaine:
Dim intQuarter As Integer = Math.Ceiling(MyDate.Month / 3)
No estoy seguro de si esto agregaría beneficios de velocidad o no, pero en mi opinión parece más limpio.