[英]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.