配置单元sql整数yyyymm前几个月

lrl1mhuk  于 2021-05-31  发布在  Hadoop
关注(0)|答案(3)|浏览(296)

我想创建一个sql语句来查找过去2个月的数据。
例如:

Select * 
from x
where sampledate<= YYYYMM-2

目前我正在使用:

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

但它在一年的前两个月会返回错误的语句:(
我的想法是用一个日期来计算,然后把它改成yyyymm整数格式。
有什么想法吗?

nzk0hqpo

nzk0hqpo1#

你能试试这个吗:

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)));

与regex和substring结合使用:

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

得到一个yyyymm日期

fiei3ece

fiei3ece2#

如果要避免转换整数,请在 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

更好的办法可能是重新调整数据的形状,使您实际上拥有一个(真实的)日期字段,并使用 `ADD_MONTHS(aRealDate, -2)` ...
编辑:
如果您的实际问题是生成 `YYYYMM` 值为“两个月前”,然后扣除使用前的2个月 `YEAR()` 以及 `MONTH()` 功能。

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

c2e8gylq

c2e8gylq3#

试试这样的。首先,获取未来/过去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;
}

查询实体的条件,这里是成员:

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());

相关问题