2016-02-12 45 views
1

我有一个用于时间表的水晶报表日期范围。 (这是我继承)我寻求帮助,如何改变这一到我的SQL查询的一部分了甲骨文的一个SSRS报告将水晶报表代码转换为日期范围的Oracle SQL查询

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

预先感谢您 史蒂芬(谁仍然是很新的SQL和SSRS报告)

+0

对'Date(1998,11,23)'使用'sysdate()'用于'Today','to_date(1998-11-23,'yyyy-mm-dd')''。 – Spidey

+0

@nimesh需要把控制权放在''1998-11-23'' – xQbert

+0

@xQbert对,错过了。 – Spidey

回答

0

你有什么直接翻译好像是:

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。如果减去您的固定的开始日期(?想必你的系统有史以来第一个周期),你会得到一个号码,from how Oracle does datetime arithmetic

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

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

因为这两个日期是在午夜这是一个整数 - 天之间的整数今天和固定的日期。如果你除以14,你得到449.285,这是整个两个星期的449,和当前的.285。你原来的计算就是这样,并删除截断的版本449只剩下.285,然后乘以14得到剩余部分作为整数,这是4.

但这正是the mod() function给你的 - “ 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,使期尾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 

我喜欢> =和<的做法不过,因为当你做对数据进行处理也不会发觉你在哪里时间也很重要。

+0

亚历克斯我不会假装完全理解你写的东西,但我会在使用它之前消化它并理解它。谢谢 – aquariumjunky

+0

@aquariumjunky - 我已经添加了一些简短版本的计算所做的解释;希望有所帮助。 –