我有一个用于时间表的水晶报表日期范围。 (这是我继承)我寻求帮助,如何改变这一到我的SQL查询的一部分了甲骨文的一个SSRS报告将水晶报表代码转换为日期范围的Oracle SQL查询
Today - Round((((Today - Date (1998,11,23))/14) - Truncate((Today - Date (1998,11,23))/14)) * 14,0)
预先感谢您 史蒂芬(谁仍然是很新的SQL和SSRS报告)
我有一个用于时间表的水晶报表日期范围。 (这是我继承)我寻求帮助,如何改变这一到我的SQL查询的一部分了甲骨文的一个SSRS报告将水晶报表代码转换为日期范围的Oracle SQL查询
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。如果减去您的固定的开始日期(?想必你的系统有史以来第一个周期),你会得到一个号码,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
我喜欢> =和<的做法不过,因为当你做对数据进行处理也不会发觉你在哪里时间也很重要。
亚历克斯我不会假装完全理解你写的东西,但我会在使用它之前消化它并理解它。谢谢 – aquariumjunky
@aquariumjunky - 我已经添加了一些简短版本的计算所做的解释;希望有所帮助。 –
对'Date(1998,11,23)'使用'sysdate()'用于'Today','to_date(1998-11-23,'yyyy-mm-dd')''。 – Spidey
@nimesh需要把控制权放在''1998-11-23'' – xQbert
@xQbert对,错过了。 – Spidey