2011-03-29 49 views
0

我正在PL/SQL中編寫一些SQL查詢,這些查詢要求我根據日期篩選記錄。該字段是一個日期/時間類型,但由於我並不真正在意我計算的時間,所以我只是從where子句中省略它。vs> = startdate和<= enddate之間的SQL

所以我寫的東西像

 
WHERE 
    f.logdate between to_date('2011/01/01', 'yyyy/mm/dd') and 
        to_date('2011/01/31', 'yyyy/mm/dd') 

要獲取所有記錄月份。我讀這應該是等同於

 
WHERE 
    f.logdate >= to_date('2011/01/01', 'yyyy/mm/dd') and 
    f.logdate <= to_date('2011/01/31', 'yyyy/mm/dd') 

但我的最終結果不出我所料:有較少的記錄,當我使用BETWEEN關鍵字比我明確規定的範圍。這是因爲我對BETWEEN做什麼的假設是錯誤的?

編輯:嗯nvm,看來日期不是問題。有一個我正在使用的子查詢是按日期過濾其結果集,並指定日期/時間,而我不是。

+0

這看起來像BETWEEN應該如何工作。您是否可以用足夠小的樣本複製它,以便可以發佈輸出,最好是顯示全部時間和日期? – 2011-03-29 18:30:44

+0

你能否在你的查詢中有一個OR子句影響你的操作順序? – 2011-03-29 18:39:38

+0

@Bill不幸的是,即使我減少到一天,仍然有很多記錄。 @PMV:這是唯一的條件 – MxyL 2011-03-29 18:43:22

回答

2

能告訴你(的SQL創建句話可以幫助)中的 「LOGDATE」 字段的類型?

在某些數據庫中,日期類型實際上是一個日期時間字段,因此如果您在「2011年1月1日」之後查找日期,那麼您確實正在尋找「Jan 01 2011 12:00:00 pm」之後的日期。

這可能是你的情況。

+0

你說得對,時間也是一個問題。我也必須指定我的開始和結束時間。 – MxyL 2011-03-29 19:14:38

1

如果時間設置爲0:00或其他奇怪的東西,它不會正常工作。

The query retrieves the expected rows because the date values in the query and the datetime values stored in the RateChangeDate column have been specified without the time part of the date. When the time part is unspecified, it defaults to 12:00 A.M. Note that a row that contains a time part that is after 12:00 A.M. on 1998-0105 would not be returned by this query because it falls outside the range. 

http://msdn.microsoft.com/en-us/library/ms187922.aspx

+1

我不知道這是答案,但問題是關於Oracle,但是您引用了T-SQL文檔。 – 2011-03-29 18:33:02

+0

確實如此,但通常數據庫的工作方式也是相似的。我認爲這可能是兩種情況。 – m4tt1mus 2011-03-29 18:36:16

相關問題