用年月构造日期
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】:如果你有正常的日期,你可以使用substr
或date_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
【讨论】:
我正在尝试使用我选择的month
和year
列来构建日期。在使用这些列时如何应用上述内容?
@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 |
+-------------+--+
【讨论】:
以上是关于用年月构造日期的主要内容,如果未能解决你的问题,请参考以下文章