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 前几个月的主要内容,如果未能解决你的问题,请参考以下文章
js 日期下拉框下拉框内容显示日期YYYYMM,要求范围:系统时间前4个月、后8个月。怎么实现?