Построение даты с указанием года и месяца - PullRequest
1 голос
/ 18 февраля 2020

Я хочу построить дату из года и месяца. В настоящее время я выполняю запрос, подобный следующему:

SELECT
    yyyy_mm_dd AS 
    t.year,
    t.month,
    t.id,
    t.name,
    ...,
    ...
    ...
FROM(
    SELECT
        p.last_yyyy_mm_dd,
        p.id,
        p.name,
    FROM(
        SELECT
            t.*,
            MAX(yyyy_mm_dd) OVER (PARTITION BY last_day(yyyy_mm_dd)) as last_yyyy_mm_dd
        FROM
            table1 t
        WHERE
            yyyy_mm_dd IS NOT NULL
            AND name = 'XXX'
    ) p
    WHERE
        yyyy_mm_dd = last_yyyy_mm_dd
) p
RIGHT JOIN(
    SELECT
        YEAR(yyyy_mm_dd) as year,
        MONTH(yyyy_mm_dd) as month,
        id,
        name,
        ...,
        ...,
        ...,
    FROM
        table2
    WHERE
        yyyy_mm_dd IS NOT NULL
        AND name = 'XXX'
    GROUP BY
        1,2,3,4
    ) t
ON
    p.id = t.id
    AND YEAR(p.last_yyyy_mm_dd) = t.year
    AND MONTH(p.last_yyyy_mm_dd) = t.month

На верхнем уровне выберите, я хотел бы также иметь поле даты (ГГГГ-ММ-ДД), построенное из года и месяца. Часть дня должна быть последним днем ​​данного месяца. Т.е. за январь будет 31.

Я посмотрел здесь https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF -DateFunctions и могу увидеть last_day, что может быть полезно, однако, похоже, что нет функция создания даты как в MySQL - https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html. Как я могу построить такую ​​дату в Улей?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Если у вас нормальная дата, вы можете извлечь yyyy-MM, используя substr или date_format:

select substr('2020-01-15',1,7);
OK
2020-01

select date_format('2020-01-15','yyyy-MM');
OK
2020-01

Чтобы получить день последнего месяца с нормальной даты, вы можете использовать last_day

select last_day(concat(substr('2020-01-15',1,7),'-01'));
OK
2020-01-31

И если у вас есть гггг-ММ и вы хотите в последний месяц, объедините его с '-01' и примените last_day:

select last_day(concat('2020-01','-01'));
OK
2020-01-31
0 голосов
/ 18 февраля 2020

попробуйте следующий код. У меня это работает:

select to_date(date_sub(add_months(concat(from_unixtime(unix_timestamp('2020-01','yyyy-MM'), 'yyyy-MM'),'-01'),1),1))

Вывод:

+-------------+--+
|     _c0     |
+-------------+--+
| 2020-01-31  |
+-------------+--+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...