Hive-获取本月的第一天,本月的最后一天,本月的天数

  1. 采用比较老的方法 FROM_UNIXTIME()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

运行结果:
today                  days
2020-08-21        31

  1. 采用 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

运行结果:
today                  days
2020-08-21        31

  1. 直接使用函数:
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;

运行结果:
2020-08-01
2020-08-01
2020-08-31
31

  1. 采用 add_months() 计算本月天数
SELECT datediff(last_day(current_date()),
	   add_months(last_day(current_date()),-1)) days

猜你喜欢

转载自blog.csdn.net/H_X_P_/article/details/108161834