可能会更开心:
SELECT * FROM TABLE
WHERE SENT_DATE BETWEEN ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1) AND TRUNC(SYSDATE,'mm') - 1
ORDER BY ELAPSED_TIME DESC
表明它们评估为相同的值:
SELECT ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1) as orig_start,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1)) as orig_end,
TRUNC(SYSDATE,'mm') - 1 as new_end
FROM dual;
ORIG_START ORIG_END NEW_END
------------------- ------------------- -------------------
2019-08-01 00:00:00 2019-08-31 00:00:00 2019-08-31 00:00:00
但请记住,between 包含在内,因此如果您的 sent_date 有非午夜时间,则将排除 2019-08-31 00:00:01 到 2019-08-31 23:59:59 之间的任何时间。
这样做更安全:
SELECT * FROM TABLE
WHERE SENT_DATE >= ADD_MONTHS(TRUNC(SYSDATE,'mm'),-1)
AND SENT_DATE < TRUNC(SYSDATE,'mm')
ORDER BY ELAPSED_TIME DESC
这将包括 2019 年 8 月 1 日 00:00:00 或之后的所有内容,直到(但不包括)2019 年 9 月 1 日 00:00:00 - 这样就不会出现缺失的日期。
或者如果它不能识别 add_months 或者:
SELECT * FROM TABLE
WHERE SENT_DATE >= TRUNC(SYSDATE,'mm') - INTERVAL '1' MONTH
AND SENT_DATE < TRUNC(SYSDATE,'mm')
ORDER BY ELAPSED_TIME DESC
(我无法测试这些中的任何一个是否真的在 H2 中工作... *8-)