我正在Oracle中编写一个我想要自动执行的查询。我目前有一个where
子句,其中包含以下内容:
TRAN.DATE BETWEEN 20160101 AND 20161231
我希望查询从当前日期开始回顾12个月。如果日期采用以下日期格式,我想我可以这样做:
TRAN.DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
但表格中的日期格式为integer
格式。我尝试过TO_DATE
功能,但我无法正确使用该格式。
答案 0 :(得分:2)
Yikes,你的意思是你的数据库表有一个20170104(二千万,十七万,一百零四)的整数,这代表今年1月的第四个?
不考虑我对这不是存储日期的最佳方式的任何担忧,如果你将你的日期转换为char然后转换为int,它可能最容易编写并理解:
WHERE DATECOLUMN BETWEEN
TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYYMMDD')) AND
TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD'))
没有必要变得聪明并试图通过将1200或10000等减去数字作为整数数学问题来处理它,因为它会使您的查询难以理解并且在几个数字上都没有性能增益按照这种方式进行转换
你现在最好将这些日期更改为实际日期,在代码库变大之前,有人决定添加更多存储为int的日期列
答案 1 :(得分:0)
你可以尝试
TO_DATE(TRAN.DATE, 'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
答案 2 :(得分:0)
的值
TO_DATE
转换CHAR,VARCHAR2,NCHAR或NVARCHAR2的char 数据类型为DATE数据类型
因此您需要先将integer
列投射到char
或上面指定的任何可接受的数据类型,然后将其投射到DATE
,如下所示。
SELECT TO_DATE(to_char(20160101),'YYYYMMDD') as DATE1 FROM DUAL
<强>结果强>
DATE1
-------------------
01.01.2016 00:00:00
所以你需要重写你的查询,如下所示。
TO_DATE(to_char(TRAN.DATE),'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
此外,如果您只需要日期部分,则还需要trunc
sysdate
。
您可以查看演示here
希望这会有所帮助。