滚动12个月oracle

时间:2017-09-06 04:08:43

标签: sql oracle date

我正在Oracle中编写一个我想要自动执行的查询。我目前有一个where子句,其中包含以下内容:

TRAN.DATE BETWEEN 20160101 AND 20161231

我希望查询从当前日期开始回顾12个月。如果日期采用以下日期格式,我想我可以这样做:

TRAN.DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE

但表格中的日期格式为integer格式。我尝试过TO_DATE功能,但我无法正确使用该格式。

3 个答案:

答案 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)

根据Oracle documentation

  

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

希望这会有所帮助。