使用SQL减去日期的n天

时间:2011-09-07 15:20:03

标签: sql oracle date-arithmetic oracle8i

对于Oracle来说,我是一个初学者。我无法弄清楚如何做类似的事情:

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS') 
FROM PEOPLE WHERE DATEBIRTH >= ANOTHERDATE - NDAY

简而言之,我想选择在特定日期和时间之前N天出生的所有人,但我不太确定这是做到这一点的方式,也不会给我预期的结果。< / p>

PS:我正在oracle8i下开发。

4 个答案:

答案 0 :(得分:4)

您的查询对我来说是正确的。这就是你从Oracle中的日期中减去天数的方法。如果您想要添加数月或数年,此链接可为您提供更多洞察力:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1157035034361

答案 1 :(得分:3)

您可能需要考虑日期的时间部分“ANOTHERDATE”。

如果您只关心整天,那么您可以将查询重写为:

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS')
  FROM PEOPLE 
 WHERE DATEBIRTH >= TRUNC(ANOTHERDATE - NDAY)

N.B。这是假设“NDAY”是数字。

“简而言之,我想选择在特定日期和时间之前N天出生的所有人,但我不太确定这是做到这一点的方式,也不会给我我期望的结果。 “

我的第一个查询会让所有人在“ANOTHERDATE”之前有一个生日 ON OR AFTER “NDAY”天。

这将为所有在“ANOTHERDATE”之前的“NDAY”日举行生日 ON 的人提供:

SELECT id,
       name,
       TO_CHAR(datebirth, 'DD/MM/YYYY HH24:MI:SS') AS birth_date
  FROM people
 WHERE TRUNC(datebirth) = TRUNC(anotherdate - NDAY);

如果“datebirth”列上有索引,那么你不想用TRUNC包装它,所以你可以使用以下能够使用“datebirth”的任何索引:

SELECT id,
       name,
       TO_CHAR(datebirth, 'DD/MM/YYYY HH24:MI:SS') AS birth_date
  FROM people
 WHERE datebirth >= TRUNC(anotherdate - NDAY)
   AND datebirth < (TRUNC(anotherdate - NDAY) + 1);

答案 2 :(得分:0)

你必须明确地将(anotherdate)转换为date,然后从中减去(ndays):

SELECT ID, NAME, TO_CHAR(DATEBIRTH, 'DD/MM/YYYY HH24:MI:SS')
  FROM PEOPLE 
 WHERE DATEBIRTH >= TO_DATE(ANOTHERDATE) - NDAY

答案 3 :(得分:-2)

以下查询从给定日期减去n天

select to_date('date') - 'n days' 
from dual 

示例:

select TO_DATE('02-Jul-16') - 90 
from dual