数据表里有一个字段叫test_Time,存储的内容为测试时间,yyyy-mm-dd HH24:Mi:SS,
我在做查询的时候需要下一个sql,需要select test_time出来,如果test_Time的HH24:Mi:SS在7:00:00和19:00:00返回白班,否则返回夜班,这个decode不知道怎么写,我尝试过直接把time的小时截取出来,但是不知道如何比较,不能转换为数字类型的出来,把小时to_date(截取的小时,‘HH24:Mi:SS')转换之后它又自动在前面加上了天,我不知道怎么写这个decode,知道的大侠指点一下啊,拜领!!

解决方案 »

  1.   

    用case whenselect case when to_number(to_char(test_time, 'hh24')) between 7 and 19 then '白班'
                else '夜班'
            end 
      from (select to_date('2008-12-5 10:00:00', 'yyyy-mm-dd hh24:mi:ss') test_time
              from dual
           ) t;
      

  2.   

    select case when to_number(to_char(test_time, 'hh24')) >=7 and to_number(to_char(test_time, 'hh24')) < 19 then '白班' 
                else '夜班' 
            end 
      from (select to_date('2008-12-5 10:00:00', 'yyyy-mm-dd hh24:mi:ss') test_time 
              from dual 
          ) t; 
      

  3.   

    decode(trunc((to_number(to_char(test_Time,'hh24'))-7)/12),0,'白班',夜班)
    这样应该可以case when 是sqlsever的写法,oracle没有
      

  4.   

    这样有bug,如果是19:20:00,其实是夜班,但是你判到白班里了,我也有这样想过,必须要考虑到分钟,考虑了之后你又不能to_number进行比较了
      

  5.   

    19-7=12
    12/12=1
    trunc(1)=1<>0
    结论夜班,没错啊
      

  6.   

    to_char(test_Time,'hh24'))是把时间的小时取出来,19:20:00取出来是19,在数据库中试下就知道了
      

  7.   

    -- TRY IT ..
    SQL> SELECT MYDATE,
      2         DECODE(SIGN(MYDATE-TO_DATE(TO_CHAR(MYDATE,'YYYY-MM-DD')||'07:00:00','YYYY-MM-DD HH24:MI:SS'))
      3               *SIGN(TO_DATE(TO_CHAR(MYDATE,'YYYY-MM-DD')||'19:00:00','YYYY-MM-DD HH24:MI:SS')-MYDATE),
      4               1,'Morning Shift',
      5               0,'Morning Shift',
      6               'Afternoon Shift') CLASS_TYPE
      7    FROM TABLE_NAME TT;MYDATE                                             CLASS_TYPE
    -------------------------------------------------- ---------------
    2008-12-3 6:30:55                                  Afternoon Shift
    2008-12-3 10:42:33                                 Morning Shift
    2008-12-3 19:22:36                                 Afternoon Shift
    2008-12-3 19:00:00                                 Morning Shift
    2008-12-4 7:00:00                                  Morning Shift
      

  8.   

    1 楼的写法是正确,试一下不就可以了吗?
    to bw555 :
    case when 是sqlsever的写法,oracle没有这是不对的,oracle中是有case语句的,看看白皮书吧
      

  9.   

    呵呵,去oracle10上试了下,果然可以,我原来是用的oracle7做的测试,
    看来有时间要去看看新特性了