Sql 连续12个月oracle

Sql 连续12个月oracle,sql,oracle,date,Sql,Oracle,Date,我正在用Oracle编写一个查询,希望实现自动化。我目前有一个where子句,它包含以下内容: TRAN.DATE BETWEEN 20160101 AND 20161231 TRAN.DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE 我希望查询是从当前日期开始的12个月回顾。如果日期是使用以下格式的日期,我想我可以这样做: TRAN.DATE BETWEEN 20160101 AND 20161231 TRAN.DATE BETWEEN

我正在用Oracle编写一个查询,希望实现自动化。我目前有一个
where
子句,它包含以下内容:

TRAN.DATE BETWEEN 20160101 AND 20161231
TRAN.DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
我希望查询是从当前日期开始的12个月回顾。如果日期是使用以下格式的日期,我想我可以这样做:

TRAN.DATE BETWEEN 20160101 AND 20161231
TRAN.DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
但是表中的日期格式是
整数
格式。我已尝试使用“截止日期”功能,但格式不正确。

您可以试试

TO_DATE(TRAN.DATE, 'YYYYMMDD')  BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
你可以试试

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

Yikes,你的意思是你的数据库表实际上有一个整数20170104(两千万,一百七十万,一百零四),这表示今年一月四号

撇开我对这不是存储日期的最佳方式的担忧不谈,如果您将日期转换为char,然后再转换为int,这可能是最容易编写和理解的:

WHERE DATECOLUMN BETWEEN
  TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYYMMDD')) AND 
  TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD'))
聪明地把它当作一个整数数学问题来处理,把1200或10000等作为一个数字减去,这是没有意义的,因为这样做会使你的查询很难理解,并且在按照这种方式进行的两次数字转换中,没有任何性能提升


您最好现在就将这些日期更改为实际日期,以免代码库变得更大,有人认为添加更多存储为int的日期列是个好主意,您的意思是您的数据库表实际上有一个整数20170104(两千万、一百七十万、一百零四)这是今年1月4日吗

撇开我对这不是存储日期的最佳方式的担忧不谈,如果您将日期转换为char,然后再转换为int,这可能是最容易编写和理解的:

WHERE DATECOLUMN BETWEEN
  TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYYMMDD')) AND 
  TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD'))
聪明地把它当作一个整数数学问题来处理,把1200或10000等作为一个数字减去,这是没有意义的,因为这样做会使你的查询很难理解,并且在按照这种方式进行的两次数字转换中,没有任何性能提升

您最好现在就将这些日期更改为实际日期,以免代码库变得更大,有人认为最好添加更多存储为int的日期列,根据

TO_DATE
转换char、VARCHAR2、NCHAR或NVARCHAR2的字符 数据类型设置为日期数据类型的值

因此,您需要首先将
integer
列强制转换为
char
或上面指定的任何接受的数据类型,然后将其强制转换为
DATE
,如下所示

SELECT TO_DATE(to_char(20160101),'YYYYMMDD') as DATE1 FROM DUAL
TO_DATE(to_char(TRAN.DATE),'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
结果

DATE1
-------------------
01.01.2016 00:00:00
因此,您需要按如下所示重写查询

SELECT TO_DATE(to_char(20160101),'YYYYMMDD') as DATE1 FROM DUAL
TO_DATE(to_char(TRAN.DATE),'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
另外,如果只需要日期部分,还需要
trunc
sysdate

你可以查看演示

希望这会有所帮助。

根据

TO_DATE
转换char、VARCHAR2、NCHAR或NVARCHAR2的字符 数据类型设置为日期数据类型的值

因此,您需要首先将
integer
列强制转换为
char
或上面指定的任何接受的数据类型,然后将其强制转换为
DATE
,如下所示

SELECT TO_DATE(to_char(20160101),'YYYYMMDD') as DATE1 FROM DUAL
TO_DATE(to_char(TRAN.DATE),'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
结果

DATE1
-------------------
01.01.2016 00:00:00
因此,您需要按如下所示重写查询

SELECT TO_DATE(to_char(20160101),'YYYYMMDD') as DATE1 FROM DUAL
TO_DATE(to_char(TRAN.DATE),'YYYYMMDD') BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
另外,如果只需要日期部分,还需要
trunc
sysdate

你可以查看演示


希望这会有所帮助。

如果没有需要使用的
tran.date
上的索引,就可以了。假设列中的所有值都可以转换为日期——历史的教训告诉我们这是不能保证的。因此,最好将ADD_MONTHS(SYSDATE,-12)amd SYSDATE转换为这种Inger格式。如果在
tran.date
上没有需要使用的索引,这是可以的。假设列中的所有值都可以转换为日期——历史教训告诉我们,这是不能保证的。因此,最好将ADD_MONTHS(SYSDATE,-12)amd SYSDATE转换为这种更安全的格式。这是更安全的方法,因为如果
trans.date
包含无法转换为日期的数值,它将处理。您说得对,该列应转换为日期数据类型。感谢您的帮助!这是一种更安全的方法,因为如果
tran.date
包含无法转换为日期的数值,则该方法可以处理。您说得对,该列应转换为日期数据类型。感谢您的帮助!