簡體   English   中英

將Crystal報表代碼轉換為日期范圍的Oracle SQL查詢

[英]Converting crystal report code to Oracle SQL query for date range

我有一個用於時間表的水晶報表日期范圍。 (我繼承的東西)我正在尋求有關如何將其更改為Oracle的sql查詢的一部分以獲取SSRS報告的幫助

Today - Round((((Today - Date (1998,11,23 ))/14) - Truncate((Today - Date (1998,11,23 ))/14)) * 14,0)

在此先感謝您,史蒂文(對sql和ssrs報表仍然很陌生的人)

您所擁有的直接翻譯似乎是:

trunc(sysdate) - round((((trunc(sysdate) - date '1998-11-23')/14) - trunc((trunc(sysdate) - date '1998-11-23')/14)) * 14,0)

但是您可以將其簡化為:

trunc(sysdate) - mod(trunc(sysdate) - date '1998-11-23', 14)

這兩個trunc(sysdate)調用給出了當前日期,時間被截斷為午夜,因此當前為2016-02-12。 如果減去固定的開始日期(可能是系統中的第一個期間?),您會從Oracle的datetime算術運算中得到一個數字:

select trunc(sysdate) - date '1998-11-23' from dual;

        TRUNC(SYSDATE)-DATE'1998-11-23'
---------------------------------------
                                   6290

因為兩個日期都在午夜,所以這是一個整數-從今天到固定日期的總天數。 如果將其除以14,則得到449.285,這是整個兩周的449,而當前為0.285。 您的原始計算會采用該方法,並刪除了截短的版本449,僅保留了.285,然后將其乘以14即可得到剩余部分的整數,即4。

但這正是mod()函數為您提供的-“ n2的余數除以n1”。 換句話說, mod(6290, 14)是6290除以14的余數,也就是4。它從一個表達式而不是兩個表達式得到相同的結果。

因此,您只需從當天減去該計算出的值4,今天就可以追溯到2016-02-08。


查看所選生成日期的變化情況:

with t (dt) as (
  select trunc(sysdate) - level from dual connect by level < 21
)
select dt,
  dt - round((((dt - date '1998-11-23')/14) - trunc((dt - date '1998-11-23')/14)) * 14) long_version,
  dt - mod(dt - date '1998-11-23', 14) period_start,
  dt - mod(dt - date '1998-11-23', 14) + 14 period_end
from t
order by dt;

DT         LONG_VERSION PERIOD_START PERIOD_END
---------- ------------ ------------ ----------
2016-01-23 2016-01-11   2016-01-11   2016-01-25
2016-01-24 2016-01-11   2016-01-11   2016-01-25
2016-01-25 2016-01-25   2016-01-25   2016-02-08
2016-01-26 2016-01-25   2016-01-25   2016-02-08
...
2016-02-06 2016-01-25   2016-01-25   2016-02-08
2016-02-07 2016-01-25   2016-01-25   2016-02-08
2016-02-08 2016-02-08   2016-02-08   2016-02-22
2016-02-09 2016-02-08   2016-02-08   2016-02-22
2016-02-10 2016-02-08   2016-02-08   2016-02-22
2016-02-11 2016-02-08   2016-02-08   2016-02-22

您可以通過將天數加到結果中來得出期間結束日期,也可以使用14天后的開始日期來單獨計算。 如果您要查找某個范圍內的記錄,則可以執行以下操作:

where some_date >= trunc(sysdate) - mod(trunc(sysdate) - date '1998-11-23', 14)
and some_date < trunc(sysdate) - mod(trunc(sysdate) - date '1998-11-23', 14) + 14

如果沒有一個日期在午夜之后有時間(可能是時間表),那么您可以between使用between並在13天后結束該周期,就像您建議您當前在注釋中所做的那樣:

where some_date between trunc(sysdate) - mod(trunc(sysdate) - date '1998-11-23', 14)
and trunc(sysdate) - mod(trunc(sysdate) - date '1998-11-23', 14) + 13

不過,我更喜歡> =和<的方法,因為當您在對時間也很重要的數據上執行某些操作時,它不會使您失望。

暫無
暫無

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

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