2009-06-30 47 views
6

Necesito comprobar si una fecha dada es el mes anterior para una consulta mensual. Puedo conseguirSeleccione el primer día del mes anterior en (DB2) SQL

CURRENT DATE - 1 MONTH 

comparar con la fecha seleccionada, pero no puedo asumir la fecha actual será el primer día de cada mes exactamente. ¿Existe una forma integrada de obtener el primer día del mes sin extraer el año y el mes y pegarlos nuevamente?

Respuesta

10

primer día de este año:

date('0001-01-01') + year(current date) years - 1 year 

primer día de este mes:

date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 1 month 

primer día del último mes:

date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 2 months 
+0

Bueno, estos son bastante indoloros. Gracias. –

0

Creo que lo siguiente funcionará para usted.

ROUND_TIMESTAMP (somedate,'W') 
+0

que no estoy viendo que la función de la lista para DB2 para plataformas Linux, UNIX y Windows. Probablemente solo esté disponible para mainframe DB2. –

+1

Mi mal. estrictamente z/OS. Nunca deja de sorprenderme cómo una empresa puede lanzar un solo producto y no tener una funcionalidad lo más universal posible en todas las plataformas. No puedo imaginar que haya una sola razón por la que esto no funcionaría en todas partes. Fuera de eso, no conozco otra solución que no sea la que ha publicado a continuación O dividir la fecha actual en trozos de cadena MES, DÍA, AÑO, modificando el MES y DÍA, y luego reconstruyendo la nueva fecha. – moleboy

+0

Lástima, esto se veía perfecto cuando lo busqué. –

1

Para completar esto con más información. La solución anterior es perfecta si desea el primer día del mes, digamos que desea el último día del mes o, en mi caso, quiero el último día del próximo trimestre.

Desde arriba que estaba haciendo

date('0001-01-31') + year(date(prevQdate))years - 1 year + month(prevQdate) months + 2 months) 

Lo que no me daba lo que quería, a veces la fecha era el 30 en lugar de 31 meses con 31 días ...

Si lo cambia a

date('0001-01-31') + year(date(prevQdate))years - 1 year + **(month(prevQdate) + 2)** months) 

Me dieron lo que quería. Parece que la primera adición de los meses a partir de la fecha del trimestre anterior restablecía la parte del DÍA de mi fecha y, por lo tanto, la segunda suma de meses funcionaba en una fecha con solo 30 días en el mes.

Algo a tener en cuenta al usar este método de manipulación de fechas en DB2.

+1

La forma más confiable de producir el último día de un mes es crear una expresión que produzca el primer día del mes siguiente y restar un día. El último día del próximo trimestre, por ejemplo, es FECHA ('0001-01-01') + AÑO (FECHA ACTUAL) AÑOS - 1 AÑO + ((TRIMESTRE (FECHA ACTUAL) +1) * 3) MESES - 1 DÍA –

11

primer día del mes actual:

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS 

primera parte del año actual es

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - (MONTH(CURRENT_DATE)-1) MONTHS 

último día del mes pasado:

CURRENT_DATE - DAY(CURRENT_DATE) DAYS 

primer día de la última Mes:

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - 1 MONTH 
0

LUW 9.7 (y creo que z/os) métodos que utilizan funciones integradas.

último día del mes actual:

LAST_DAY(CURRENT DATE) 

primer día del mes anterior:

LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE - 1 month, 'MONTH') 

primer día del mes actual:

LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE, 'MONTH'); 
2

Aquí son fragmentos de mi DB2 SQL Hoja de referencia del cálculo del mes:

el comienzo del mes actual:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS 

al final del mes actual:

LAST_DAY(CURRENT DATE) 

el comienzo del mes anterior:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS - 1 MONTHS 

al final del mes anterior:

LAST_DAY(CURRENT DATE - 1 MONTHS) 

A partir del mes siguiente:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS + 1 MONTHS 

al final del mes siguiente:

LAST_DAY(CURRENT DATE + 1 MONTHS) 
Cuestiones relacionadas