2010-11-03 15 views
1

條款我在這一個日期的日期列,但我需要查詢它來查找記錄少於30天。的Oracle SQL如果對一個日期列

START_DATE 
---------- 
01-AUG-2010 
09-AUG-2010 
22-AUG-2010 
09-SEP-2010 

查詢:

SELECT START_DATE 
WHERE START_DATE < 30; 

我知道這是Oracle SQL簡單的查詢,但我做錯了什麼。

+1

的可能重複甲骨文SQL Where子句中找到最新記錄超過30天(http://stackoverflow.com/questions/3860295/oracle-sql-where-clause-to-find-date-records-older -than-30-days) – APC 2010-11-04 05:28:54

回答

-1

WHERE START_DATE> SYSDATE - 1

或許

WHERE TRIM(STARTDATE)> TRIM(SYSDATE) - 1

+1

我認爲在Oracle中,添加(或減去)一個數字,日期補充說,許多*天*,所以你只要減去從sysdate中刪除1天。另外,我不確定爲什麼要修剪sysdate。 – FrustratedWithFormsDesigner 2010-11-03 20:05:40

+1

@FrustratedWithFormsDesigner:我認爲他的意思是TRUNC,但是對錶格列運行並不好。 – 2010-11-03 20:07:52

+0

是的,對錯誤1而不是30 :) – maximdim 2010-11-03 20:11:51

6

用途:

SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > SYSDATE - 30 
  • SYSDATE是Oracle的語法來獲取當前日期和時間
  • 在Oracle中,你可以在幾天的情況下做的日期計算,所以SYSDATE - 30層的意思是「當前日期,減去三十天「以獲得過去三十天的日期

如果您想根據午夜三十天之後評估日期,請使用TRUNC function

SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > TRUNC(SYSDATE) - 30 

不要在列運行TRUNC - 這將使該列無用的指標,確保了表掃描。

+1

或者,您可以嘗試'where months_between(sysdate,t.start_date)<= 1'。雖然我認爲你可能會得到稍微不同的結果,具體取決於有關月份的長短。 Oracle中存在'months_between',但我不知道其他數據庫是否實現了類似的功能。 – FrustratedWithFormsDesigner 2010-11-03 20:18:24

+0

@FrustratedWithFormsDesigner:沒錯,但加/減一個月不保證滿三十歲天 - IE中減去每月從3月29日... :) – 2010-11-03 20:21:10

+0

真。有時需求會說「3個月之前......」,有時他們會說「90天之前......」,有些人似乎認爲他們是相當的,所以他們說一個時,他們的意思是另一個。於是我的代碼來一個標準才發現他們指的是另一種方式... – FrustratedWithFormsDesigner 2010-11-03 20:26:28

3
SELECT t.start_date 
    FROM YOUR_TABLE t 
WHERE t.start_date > SYSDATE - INTERVAL '30' DAY; 

INTERVAL更加輕便不是假設你可以添加或減去幾天,但我注意到Oracle和PostgreSQL之間的INTERVAL語法略有差異。

+2

不幸的是,日期處理在數據庫之間不是很方便。 – 2010-11-03 20:07:11