2017-08-07 82 views
3

之间我想要做的SQL如下:检查时间是两次

我有三个班次:

移1:07:00 - 14:59
变速2:15: 00 - 22:59
移3:23:00 - 06:59

我想知道哪些转向我其实是在,这取决于我的SYSDATE(时间)。 以下声明对于“02:00”不起作用。 START_TIME和END_TIME的VARCHAR2

SELECT * FROM abc 
    WHERE to_char(sysdate, 'HH24:MI') 
    between start_time and end_time; 

我怎样才能做到这一点?

+0

如果start_time和end_time在varchar中,那么该日期的格式是什么? – Rams

+0

它是HH24:MI:Shift 1:07:00 - 14:59 Shift 2:15:00 - 22:59 Shift 3:23:00 - 06:59 – Anja

回答

2
select * 
    from abc 
    where mod(EXTRACT(HOUR FROM CAST(sysdate AS TIMESTAMP))+1,24) 
between mod(EXTRACT(HOUR FROM CAST(to_date(start_time,'hh24:mi') AS TIMESTAMP))+1,24) 
    and mod(EXTRACT(HOUR FROM CAST(to_date(end_time,'hh24:mi') AS TIMESTAMP))+1,24) 

;

+1

是的!你说对了。完善。非常感谢 !! – Anja

-1

考虑你的varchar字段的名称是'charTime',表名是abc。 在MySQL中,你可以这样做:

select 
* 
from abc 
where DATE_FORMAT(charTime,'%H:%i') BETWEEN '2017-07-01' 
AND '2017-10-01'; 

在SQLSVR你可以这样做:

SELECT 
    CONVERT (
     VARCHAR (12), 
     charTime, 
     108 
    ) 
FROM 
    abc WHERE charTime BETWEEN '2017-07-01' 
AND '2017-10-01' 

在Oracle中,你可以做到这一点(只需使用SQL):

select 
* 
from abc 
where charTime 
between to_date('2017-07-01','hh24:mi:ss') and to_date('2017-10-01','hh24:mi:ss') 
+0

我需要plsql代码请 – Anja

+0

Oracle代码错误。它会给'ORA-01861'错误。 – Nitish