我需要分析一个SQL查询(并在MDX中构造它的等价物)。我不熟悉SQL而且无法访问数据库,因此有5个简单的事情我无法弄清楚:
WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3
部分是什么意思?特别:
trunc(SYSDATE, 'iw')
中减去7会怎么做?减去7周或7天?我理解trunc(...)
表达式是一个0-53的值,对应于一年中的一周,但它似乎与标签“上周”冲突,并说明了查询的目的。trunc(...)
的值是否被评估为日期?substr()
和to_char()
以及需要这组?如果使用trunc(idate, 'HH24:MI')
而会发生什么?pm
做什么?还有cm
似乎具有类似的功能。这些部分是临时表名吗?此处参考是查询。 (在Oracle数据库中,如果它有任何区别。)其目的是“分析防火墙接受事件与上周相比的趋势”:
SELECT 'Previous Week Average' AS term ,
Substr(To_char(idate, 'HH24:MI'), 0, 4)
|| '0' AS event_time ,
Round(Avg(tot_accept)) AS cnt
FROM (
SELECT *
FROM st_event_100_#yyyymm-1m#
WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3 #stat_monitor_group_query#
UNION ALL
SELECT *
FROM st_event_100_#yyyymm#
WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3 #stat_monitor_group_query# ) pm
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0'
UNION ALL
SELECT 'Today' AS term ,
substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0' AS event_time ,
round(avg(tot_accept)) AS cnt
FROM st_event_100_#yyyymm# cm
WHERE idate >= trunc(SYSDATE) #stat_monitor_group_query#
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0'
ORDER BY term DESC,
event_time ASC
答案 0 :(得分:2)
iw
将日期截断为ISO 8601标准定义的日历周的第一天,即星期一。从日期中减去数字时,它始终是天数。因此,idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3
会为您提供介于上周和周五之间的日期。
to_char(idate, 'HH24:MI')
以24小时格式为您提供时间(小时和分钟)部分。例如:14:33
。通过使用substrin只提取4个字符,您实际上获得了14:3
。所以是的,这个组的粒度为10分钟。
你不能写trunc(idate, 'HH24:MI')
。它只能有1 precision specifier。
如果你写trunc(idate,'HH24')
,它会截断到小时。如果您使用MI
,它会截断到分钟。因此,将它截断到10分钟是有点棘手的。
pm
只是整个子查询的别名。
SELECT *
FROM st_event_100_#yyyymm-1m#
......
WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3 #stat_monitor_group_query#
#
是查询中表格的一部分。它没有意义。但是,它可能是项目/公司特定的。