日期操作/比较/分组如何在SQL查询中工作?

时间:2016-06-16 03:37:24

标签: sql oracle datetime

我需要分析一个SQL查询(并在MDX中构造它的等价物)。我不熟悉SQL而且无法访问数据库,因此有5个简单的事情我无法弄清楚:

  1. WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3部分是什么意思?特别:
    • trunc(SYSDATE, 'iw')中减去7会怎么做?减去7周或7天?我理解trunc(...)表达式是一个0-53的值,对应于一年中的一周,但它似乎与标签“上周”冲突,并说明了查询的目的。
    • SQL如何比较日期?在比较过程中,trunc(...)的值是否被评估为日期?
  2. 如果查询在同一分钟内发生,则查询似乎将行组合在一起。但是,我可以看到的几行输出具有10分钟的粒度(00:00,00:10,00:20等)。查询中是否存在将行分组为10分钟的间隔,或者这是结果输入数据?
  3. 为什么要按照条件拨打substr()to_char()以及需要这组?如果使用trunc(idate, 'HH24:MI')而会发生什么?
  4. pm做什么?还有cm似乎具有类似的功能。这些部分是临时表名吗?
  5. 最后,哈希标记(#)如何影响此查询?我读到它可能是表示临时表。如果是这样,这些临时表是手动创建的,还是在查询中做了什么导致它们被创建?
  6. 此处参考是查询。 (在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
    

1 个答案:

答案 0 :(得分:2)

  1. iw将日期截断为ISO 8601标准定义的日历周的第一天,即星期一。从日期中减去数字时,它始终是天数。因此,idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3会为您提供介于上周和周五之间的日期。

  2. to_char(idate, 'HH24:MI')以24小时格式为您提供时间(小时和分钟)部分。例如:14:33。通过使用substrin只提取4个字符,您实际上获得了14:3。所以是的,这个组的粒度为10分钟。

  3. 你不能写trunc(idate, 'HH24:MI')。它只能有1 precision specifier

    如果你写trunc(idate,'HH24'),它会截断到小时。如果您使用MI,它会截断到分钟。因此,将它截断到10分钟是有点棘手的。

  4. pm只是整个子查询的别名。

    SELECT * FROM st_event_100_#yyyymm-1m# ...... WHERE idate BETWEEN trunc(SYSDATE, 'iw')-7 AND trunc(SYSDATE, 'iw')-3 #stat_monitor_group_query#

  5. #是查询中表格的一部分。它没有意义。但是,它可能是项目/公司特定的。