Hive SQL 整数 YYYYMM 前几个月

Posted

技术标签:

【中文标题】Hive SQL 整数 YYYYMM 前几个月【英文标题】:Hive SQL Integer YYYYMM previous Months 【发布时间】:2018-04-17 11:18:15 【问题描述】:

我想创建一个查找过去 2 个月的 SQL 语句。

例如:

Select * 
from x
where sampledate<= YYYYMM-2

目前我正在使用这个:

(year(from_unixtime(unix_timestamp()))*100+month(from_unixtime(unix_timestamp())))-1

但它在一年的前两个月返回错误的语句:(

我的想法是用日期计算,然后将其更改为 yyyymm 整数格式。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以试试这个:

SELECT colomn
FROM table
WHERE date > (SELECT add_months(from_unixtime(unix_timestamp()),-2));

或者你可以使用:

SELECT colomn
FROM table
WHERE date > to_date(SELECT year(add_months(from_unixtime(unix_timestamp()),-2))+month(add_months(from_unixtime(unix_timestamp()),-2)));

结合正则表达式和子字符串:

SELECT colomn
FROM table
where sampledate>=substr(regexp_replace(add_months(from_unixtime(unix_timestamp()),-2), '-',''),1,6)

获取 YYYYMM 日期

【讨论】:

我需要像 YYYYMM 这样的采样日期,所以我使用带有正则表达式和子字符串的代码将 2017-12-30 转换为 201712:sampledate>=substr(regexp_replace(add_months(from_unixtime(unix_timestamp()),- 2), '-',''),1,6) 您可以通过添加正则表达式和子字符串来编辑此答案,如果您认为它有帮助也可以接受它【参考方案2】:

如果您想避免将YYYYMM 格式的整数与日期转换,您可以只使用数学和CASE 语句...

例如YYYYMM % 100 会给你MM。然后你可以检查它是否为 2 或更少。如果小于等于2,则减100减一年,加12得到月份为13或14。那么,减2就可以得到正确的答案。

重新安排,你会得到YYYYMM - 2 + (88, if the month is 1 or 2)

sampledate <= YYYYMM - 2 + CASE WHEN YYYYMM % 100 <= 2 THEN 88 ELSE 0 END

更好的想法可能是重塑您的数据,以便您实际上有一个 (real) 日期字段,并且只需使用 ADD_MONTHS(aRealDate, -2)...

编辑:

如果您的实际问题是为“两个月前”生成 YYYYMM 值,那么请扣除您使用 YEAR() 和 @987654330 之前的 2 个月 @函数。

year(  ADD_MONTHS(from_unixtime(unix_timestamp()), -2) )*100
+
month( ADD_MONTHS(from_unixtime(unix_timestamp()), -2) )

【讨论】:

【参考方案3】:

试试这样的。 首先,一个获取未来/过去 n 个月日期的实用程序:

public Date nMonthsFromDate(Date date, int interval) 
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    // E.G. to get 2 months ago, add -2
    cal.add(Calendar.MONTH, interval); 
    Date result = cal.getTime();
    return result;

实体上的条件查询,这里是Member:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> q = cb.createQuery(Member.class);
Root<Member> memberRoot = q.from(Member.class);
Date theDate = nMonthsFromToday(-2);
Predicate pred = cb.greaterThanOrEqualTo(
    memberRoot.<Date>get("timeStamp"), theDate);
q.where(pred);
TypedQuery<Member> theQuery = em.createQuery(q);
String qStr = theQuery
    .unwrap(org.apache.openjpa.persistence.QueryImpl.class)
    .getQueryString();
LOG.info("Query: " + qStr);
List<Member> results = null;
try 
    results = theQuery.getResultList();
 catch (Exception e) 
    LOG.severe(e.getMessage());
    e.printStackTrace();

return results;

最后,注意比较日期 [java.util.Date] 和时间戳 [util.sql.Date]。由于 Java 中的一个怪癖,对于等效日期,date.equals(timeStamp) 返回 true,但 timeStamp.equals(date) 返回 FALSE。使两个日期都符合 java.util.Date:

public java.util.Date getStandardDate(Date date) 
    return new java.util.Date(date.getTime());

【讨论】:

感谢您的详细解答。我正在寻找 SQL 查询的 where 条件。那是scala代码吗?最好的问候 pazaak

以上是关于Hive SQL 整数 YYYYMM 前几个月的主要内容,如果未能解决你的问题,请参考以下文章

在 HIVE 中选择上个月的 YYYYMM

js 日期下拉框下拉框内容显示日期YYYYMM,要求范围:系统时间前4个月、后8个月。怎么实现?

前几个月的 SQL 固定日期

Tsql -> 从今天开始过滤 6 个月的数据,表中的日期字段为 YYYYMM

Hive学习之路 Hive SQL之数据类型和存储格式

Hive SQL之数据类型和存储格式