簡體   English   中英

如何在where子句中使用表達式為查詢返回動態日期范圍

[英]How can I use an expression in my where clause to return a dynamic date range for my query

我正在BIDS 2008r2上處理SSRS報告,該報告從Oracle數據庫中提取數據。

我有一個使用硬日期范圍的where子句,我想將其更改為一個表達式,該表達式將隨着時間的推移而動態變化。

這是where子句,當前可用於將上個月的第一天返回到上個月的最后一天。 即我正在尋找上個月的所有數據

WHERE  CHRGDTTM BETWEEN {ts '2015-12-01 00:00:00'} AND {ts '2015-12-31 23:59:00'}

我寫了一個返回上個月初的表達式:

DateAdd(DateInterval.Month, -1, DateSerial(Year(Date.Now), Month(Date.Now), 1))

一個返回上個月末的值:

DateAdd(DateInterval.Minute, -1, DateSerial(Year(Date.Now), Month(Date.Now), 1))

我該如何將它們放入我的where子句中?

謝謝。

如果要完全在Oracle where子句中執行此操作,則可以執行以下操作:

WHERE CHRGDTTM >= ADD_MONTHS(TRUNC(sysdate, 'MM'), -1)
AND CHRGDTTM < TRUNC(sysdate, 'MM')

TRUNC(date)函數會截斷提供的日期-在這種情況下為系統日期; 默認情況下,它會刪除時間部分,因此會在今天早上給您提供午夜,但這可以通過MM格式模型修改該行為,並在當月的第一天給您提供午夜。 因此,今天TRUNC(SYSDATE, 'MM')給您2016-01-26 00:00:00。 您可以按原樣使用它作為日期范圍的上限。

ADD_MONTHS()函數會增加幾個月的時間,此處為-1會給您2015-12-01 00:00:00。 從2015年12月1日00:00:00到但不包括2016年1月1日00:00:00的所有時間加起來,這等於您的BETWEEN范圍。

您還可以使用間隔計算來獲取上個月的開始時間:

WHERE CHRGDTTM >= TRUNC(sysdate, 'MM') - INTERVAL '1' MONTH
AND CHRGDTTM < TRUNC(sysdate, 'MM')

這具有相同的效果,並且很安全,因為您總是要從計算中得到一個有效的日期; 月底的日期可能會有更多問題。

您可以在文檔中閱讀有關日期時間/間隔算術的更多信息。

或者,您可以創建兩個類型為Date / Time的參數,並使用已開發的表達式為這些參數設置默認值。 然后在查詢中,它只是在WHERE CHRGDTTM BETWEEN :StartDate AND :EndDate 如果用戶不必為此擔心,請將兩者的可見性都設置為“隱藏”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM