表stime有一列begintime,此列为date类型,现在需要查询时刻,并按照时刻分组,统计数量。
比方有一个记录begintime为'2010-5-19 17:26:04',如何变成'2010-5-19 17点2刻'呢?原本想截取出来分钟数26,然后写一个函数将26转化成2刻,但是觉得太麻烦了,不知道大家有没有比较好的办法呢?

解决方案 »

  1.   

    还有一个类似的问题:
    比方一个月 1号到7号为第一周  8号到14号位第二周 15号到21号为第三周  22号到28号为第四周 29到月底为第五周,有一个记录begintime为'2010-5-19 17:26:04',如果我不写专门的函数来处理,如何通过简单的sql来 将之变成'2010年5月第四周'呢?
      

  2.   

    不好意思,说错了,是  如何通过简单的sql来 将之变成'2010年5月第三周'呢?
      

  3.   

    oracle 没有这种表示方法,只能自己做个转换函数,即使有这样的转换,也需要ORACLE内建函数转换
      

  4.   

    1.
    SELECT to_char(a,'yyyy-mm-dd hh24"点"')||round(to_char(a,'mi')/15)||'刻'
    from (select to_date('2010-5-19 17:26:04','yyyy-mm-dd hh24:mi:ss') a from dual);
    这里还有四舍五入这么进位的问题,大致想法就是这样。或者用case when
    2.
    SELECT to_char(a,'yyyy"年"mm"月第"w"周"')
    from (select to_date('2010-5-19 17:26:04','yyyy-mm-dd hh24:mi:ss') a from dual)
      

  5.   

    参考:
    SELECT to_char(begintime,'yyyy')||'年'||
    to_number(to_char(begintime,'mm'))||'月'||
    CASE 
    WHEN to_char(begintime,'DD') >='01' AND to_char(begintime,'DD') <='07' THEN '第一周'
    WHEN to_char(begintime,'DD') >='08' AND to_char(begintime,'DD') <='14' THEN '第二周'
    WHEN to_char(begintime,'DD') >='15' AND to_char(begintime,'DD') <='21' THEN '第三周'
    WHEN to_char(begintime,'DD') >='22' AND to_char(begintime,'DD') <='28' THEN '第四周'
    WHEN to_char(begintime,'DD') >='29'  THEN '第五周' END ||
    to_char(begintime,'HH24')||'点'||
    CASE 
    WHEN to_char(begintime,'MI') >='01' AND to_char(begintime,'MI') <='15' THEN '1刻'
    WHEN to_char(begintime,'MI') >='16' AND to_char(begintime,'MI') <='30' THEN '2刻'
    WHEN to_char(begintime,'MI') >='31' AND to_char(begintime,'MI') <='45' THEN '3刻'
    WHEN to_char(begintime,'MI') >='46' AND to_char(begintime,'MI') <='60' THEN '4刻'
    END AS ceshi 
    FROM (SELECT SYSDATE AS begintime FROM dual) a
      

  6.   


    谢谢,四舍五入的时候 round改用floor即可。