Hive: obtenga el primer día del mes, el último día del mes y el número de días del mes

  1. Utilice los métodos más antiguos FROM_UNIXTIME () y UNIX_TIMESTAMP ()
SELECT
  current_date() today,
  (datediff(lastday, firstday) + 1) days
FROM
  (
    SELECT
      CASE
        WHEN MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) IN (4, 6, 9, 11)
            THEN date_add(
              (FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')),
              30 - DAY(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd'))
            )
        WHEN MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) IN (1, 3, 5, 7, 8, 10, 12)
            THEN date_add(
              (FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')),
              31 - DAY(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd'))
            )
        WHEN MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) = 2
        AND ((YEAR(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) % 4 = 0 AND YEAR(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) % 100 != 0)
            OR YEAR(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')) % 400 = 0)
            THEN date_add(
              (FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')),
              29 - DAY(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd'))
            )
            ELSE date_add(
              (FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd')),
              28 - DAY(FROM_UNIXTIME(UNIX_TIMESTAMP(), 'yyyy-MM-dd'))
            )
      END AS lastday, --获取本月最后一天
      concat(substr(current_date(), 1, 8), '01') firstday --获取本月第一天
  ) t1

Resultado de la operación:
hoy días
2020-08-21 31

  1. Utilice CURRENT_TIMESTAMP ()
SELECT
  current_date() today,
  (datediff(lastday, firstday) + 1) days
FROM
  (
    SELECT
      CASE
        WHEN MONTH(CURRENT_TIMESTAMP()) IN (4, 6, 9, 11)
            THEN date_add(CURRENT_TIMESTAMP(), 30 - DAY(CURRENT_TIMESTAMP()))
        WHEN MONTH(CURRENT_TIMESTAMP()) IN (1, 3, 5, 7, 8, 10, 12)
            THEN date_add(CURRENT_TIMESTAMP(), 31 - DAY(CURRENT_TIMESTAMP()))
        WHEN MONTH(CURRENT_TIMESTAMP()) = 2
          AND ((YEAR(CURRENT_TIMESTAMP()) % 4 = 0 AND YEAR(CURRENT_TIMESTAMP()) % 100 != 0)
            OR YEAR(CURRENT_TIMESTAMP()) % 400 = 0)
            THEN date_add(CURRENT_TIMESTAMP(), 29 - DAY(CURRENT_TIMESTAMP()))
            ELSE date_add((CURRENT_TIMESTAMP()), 28 - DAY(CURRENT_TIMESTAMP()))
      END AS lastday, --获取本月最后一天
      concat(substr(current_date(), 1, 8), '01') firstday --获取本月第一天
  ) t1

Resultado de la operación:
hoy días
2020-08-21 31

  1. Utilice funciones directamente:
select trunc(current_date(),'MM');
select trunc('2020-08-21','MM');
select last_day(current_date());
select (datediff(last_day(current_date()),
		trunc(current_date(),'MM')) + 1) days;

Resultado de la operación:
2020-08-01
2020-08-01
2020-08-31
31

  1. Use add_months () para calcular el número de días del mes
SELECT datediff(last_day(current_date()),
	   add_months(last_day(current_date()),-1)) days

Supongo que te gusta

Origin blog.csdn.net/H_X_P_/article/details/108161834
Recomendado
Clasificación