用年月构造日期

Posted

技术标签:

【中文标题】用年月构造日期【英文标题】:Constructing a date with year and month 【发布时间】:2020-02-18 08:39:12 【问题描述】:

我想从一年和一个月中构造一个日期。我目前正在运行这样的查询:

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

在***选择中,我还希望有一个由年份和月份构成的日期 (YYYY-MM-DD) 字段。日部分应该是给定月份的最后一天。 IE。一月份是 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 这样的生成日期函数。如何在 Hive 中构建这样的日期?

【问题讨论】:

【参考方案1】:

如果你有正常的日期,你可以使用substrdate_format提取yyyy-MM

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

如果您有 yyyy-MM 并且想要上个月的某一天,请将其与“-01”连接并应用 last_day:

select last_day(concat('2020-01','-01'));
OK
2020-01-31

【讨论】:

我正在尝试使用我选择的monthyear 列来构建日期。在使用这些列时如何应用上述内容? @stackq 使用 concat(year, '-',month) 连接它们。如果你想要最后一天,那么选择 last_day(concat(year, '-', month,'-01'));如果月份不是两位数的字符串,则使用 lpad(month, 2, 0) 在连接之前获取两位数的月份【参考方案2】:

尝试下一个代码。它对我有用:

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  |
+-------------+--+

【讨论】:

以上是关于用年月构造日期的主要内容,如果未能解决你的问题,请参考以下文章

js中怎么把只有年月的日期转为时间戳

sql获取当前年月日

给定年月日 怎样用C语言编程计算2个日期之间的时间天数

java怎么分开获取系统年月日

年月日日期正则

lua中以表格形式输出日期的年月日