2011-05-21 232 views
-2

從今天查詢最後7天AS400,因爲它存儲在char類型日期如何從今天的結果,我嘗試使用諸如AS400日期查詢

 where chardate >= char(days(curdate()) + 7) 

但它仍然沒有工作

回答

2

對於從今天過去7天:

where 
date(substr(chardate,1,4) || '-' || 
substr(chardate,5,2) || '-' || 
substr(chardate,7,2)) between current date - 7 days and current date 

要執行字符範圍比較:

where 
chardate between 
substr(char(current date - 7 days, iso),1,4) || 
substr(char(curernt date - 7 days, iso),6,2) || 
substr(char(current date - 7 days, iso),9,2) 
and 
substr(char(current date, iso),1,4) || 
substr(char(current date, iso),6,2) || 
substr(char(current date, iso),9,2) 
+0

@JamesA:只要您不希望查詢使用任何包含'chardate'的索引,這可以是一個好的選擇。 – dmc 2011-05-23 15:40:24

+0

@dmc:好點。我沒有想到索引優化。 – jamesallman 2011-05-23 16:41:37

+0

但是它仍然返回超過65000行而不是7天的行 – jbsuser 2011-05-28 07:03:49

4

答案有兩部分。第一個涉及這個特定風格的DB2的日期數學。相當於curdate()) + 7的DB2表達式是current date + 7 days

第二個涉及將日期值轉換爲字符值(反之亦然),以便我們可以比較它們。我們需要知道什麼格式chardate存儲日期之前,我們可以真正破解那一個。我們假設它的格式爲YYYY-MM-DD。然後,您可以使用char(current date + 7 days, iso)以相同的格式在將來獲得七天。

所以,用這種假設,你在那裏聲明將是

where chardate >= char(current date + 7 days, iso) 

有幾個標準的日期格式date可轉換爲:

  • ISO:YYYY-MM-DD
  • 美國:MM/DD/YYYY
  • EUR:DD.MM.YYYY
  • JIS:YYYY-MM-DD

如果您chardate是不同的格式,你需要做一些比較繁瑣的工作,substr。例如,要YYYY-MM-DD轉換爲YYYYMMDD你需要像

substr(char(current date, iso), 1, 4) || 
substr(char(current date, iso), 5, 2) || 
substr(char(current date, iso), 7, 2) 

這種方法的主要問題是未存儲在「年月日」順序格式不能可靠地比較。也就是說,12311969(即MMDDYYYY)將比較大於01012011,因爲就數據庫而言,你是在比較兩個八位數字。 (這就是爲什麼你應該總是存儲在實際date領域或YYYYMMDD或類似正常有序的格式的日期。)

我已經使用免費的實用工具叫做idate,它提供了SQL用戶定義的函數巨大的成功(UDF)的將char &數字字段中存儲的日期轉換爲日期。請注意,該解決方案需要RPG編譯器的可用性。

+0

其中chardate> =日期(當前日期+ 7天,異)我得到了錯誤coloumn iso不在指定的表格中,我的日期格式是在yyyymmdd字符類型我試過上面的三個查詢,但它沒有奏效。也得到相同的錯誤日期,時間或時間戳字符串中的值無效 – jbsuser 2011-05-22 06:54:03

+0

@ jbs123 @dmc用示例where語句做了一個錯字。它應該是「where chardate> = char(當前日期+ 7天,iso)」 – jamesallman 2011-05-23 14:58:01

+0

@JamesA感謝您的更正! – dmc 2011-05-23 15:34:23