周一至周五,8:30-12:00 13:30-17:30
精确到小时,怎么弄?

解决方案 »

  1.   

    是啊,开始时间TimeStart,结束时间TimeEnd,算这两个时间中间的工作时间
    工作时间:周一至周五,8:30-12:00 13:30-17:30
      

  2.   

    这样是你要的效果吗?SQL> select localtimestamp,to_char(sysdate,'hh24') hour,to_char(sysdate,'mi') min from dual;LOCALTIMESTAMP                                                              HO MI
    --------------------------------------------------------------------------- -- --
    10-7月 -10 11.57.39.093000 上午                                             11 57
      

  3.   

    就我个人的看法来说,应该是设计的事情,你只描述一个时间范围,就告诉我们你是如何设计表结构的,那岂不是让我们大伙搬手指头算嘛,当然要慢慢搬也能搬出来,呵呵,不过请先公布你的结构。
    这个类似于一个工作日表结构的设计,根据设计结构应当有不同的算法,如果你这个是针对整个总体上的一个时间规划(没有精确到时间段以及个人,因为有可能该时间段有节假日,或者个人请假串休等问题,甚至于有加班的情况,存在超过2个时间段的),此时就只是算一个大概的话,那么这是一个顶层配置(或者是针对一个管理区域,如一个部门的顶层配置),对于数据库来说这是一行数据,那么在数据库中如何存储是一个关键。
    一般你可以存储小时的起始时间数据、结束小时数据,起始分钟数据,出来的时候转换就要自己算,算得比较麻烦,由于ORACLE没有TIME这个类型,我个人建议你这样存储:
    SELECT to_date('0001-01-01 8:30','YYYY-MM-DD HH24:MI'),
           to_date('0001-01-01 12:00','YYYY-MM-DD HH24:MI'),
           to_date('0001-01-01 13:30','YYYY-MM-DD HH24:MI'),
           to_date('0001-01-01 17:30','YYYY-MM-DD HH24:MI')
            FROM dual;
    也就是一行数据是:
    TO_DATE('0001-01-018:30','YYYY TO_DATE('0001-01-0112:00','YYY TO_DATE('0001-01-0113:30','YYY TO_DATE('0001-01-0117:30','YYY
    ------------------------------ ------------------------------ ------------------------------ ------------------------------
    0001-01-01 8:30:00             0001-01-01 12:00:00            0001-01-01 13:30:00            0001-01-01 17:30:00此时时间就可以用减法了,但是你会发现,每次都去减的话有点麻烦,不如冗余一个字段在存进去的时候就把每天的时间差剪出来,增加一个字段:
    SELECT START_AM,END_AM,START_PM,END_PM,(END_AM-START_AM)+(END_PM-START_PM) TIME_DELAY
    FROM(SELECT to_date('0001-01-01 8:30','YYYY-MM-DD HH24:MI') START_AM,
           to_date('0001-01-01 12:00','YYYY-MM-DD HH24:MI') END_AM,
           to_date('0001-01-01 13:30','YYYY-MM-DD HH24:MI') START_PM,
           to_date('0001-01-01 17:30','YYYY-MM-DD HH24:MI') END_PM
            FROM dual);起始就是这样存储:
    START_AM    END_AM      START_PM    END_PM      TIME_DELAY
    ----------- ----------- ----------- ----------- ----------
    0001-01-01  0001-01-01  0001-01-01  0001-01-01      0.31250.3125的单位就是天,乘以1440就是分钟数,乘以24当然是小时数了,这些都不用多说。这个时候你会发现你已经算出一天内有多少小时是工作小时了,那么此时需要计算哪些是工作日了。一般会有一个子表,但是如果公司是统一星期一到星期五进行管理的话,一种存储方式是使用两个字段,将星期几进行编号,按照中国方式星期一到星期天进行排序,将其分段存储在上表,最后计算的时候,将TIME_DELAY乘以这个天数即可,如果每周固定工作日个数,但是不规定具体时间,那么就存储一下个数,直接用个数来存储,如果需要记录具体的那几天,那么那个字段用于查询就行,而算结果用工作日的个数来算就可以。不过为了灵活其间,还是用子表来存储工作日的规则,不过如何设计是看实际的需求,其实这类问题说难不难,说简单不简单,设计复杂可以做得非常复杂,关键看需求,即使复杂一定要考虑到写代码的复杂性,否则性能会随着数据量的膨胀产生问题,试想一下,一个上万人的企业内部,每个部门有自己的总体规则,包含节假日、人员串休、调休、加班、各项数据要规范化管理,而且每周可能都会有不同的事情产生,这个数据量会精确到每个人的每个时间段(我们以前有设计过精确到每个人的分钟数上的),最后绩效考核的时候,需要快速调度出各个维度的年报、季度报表、月报、周报等数据。