PL / SQL检查SYSDATE是否介于两个DATETIMES“HH24:mi”之间

时间:2015-06-09 19:04:33

标签: sql oracle plsql

我正在尝试创建一个函数来检查我的sysdate是否在HH24:mi上的2个数据之间。如果这是真的,那么如果它不返回0则需要返回1.

我试过这个但没有成功:Check if current date is between two dates Oracle SQL

以下是我使用的代码:

create or replace FUNCTION WinkelOpen(winkelID Number)
  RETURN NUMBER
IS
  CURSOR c_tijden_t(v_temp_winkelID IN NUMBER, v_temp_dag IN VARCHAR2) IS
        SELECT * FROM Openingstijd
        WHERE winkel_id = v_temp_winkelID
        AND dag = v_temp_dag;

  TYPE a_array_days IS VARRAY(7) OF VARCHAR2(2);
    v_dagen a_array_days := a_array_days('ma', 'di', 'wo', 'do', 'vr', 'za', 'zo');    

  v_temp_suc  NUMBER;
  v_isClosed Number(1,0) := 0;


BEGIN
  FOR i IN c_tijden_t(winkelID, v_dagen(to_char (SYSDATE, 'D')-1)) LOOP

    select * INTO v_temp_suc from dual 
    WHERE trunc(sysdate) 
    BETWEEN TO_DATE(i.open, 'HH24:mi') 
    AND TO_DATE(i.gesloten, 'HH24:mi');

    --if v_temp_suc is 0 then keep looping
    --else v_isClosed = 1 break loop

    END LOOP;
    RETURN v_isClosed;
END WinkelOpen;

3 个答案:

答案 0 :(得分:2)

假设i.openi.gesloten中的数据格式为HH24:MI10之前的小时为零填充),您可以在过程中使用此查询:

SELECT count(*) INTO v_temp_suc FROM dual 
WHERE to_char(sysdate, 'HH24:MI') 
BETWEEN i.open AND i.gesloten;

查询将返回01,具体取决于(数据库的)当前时间是否在该时间间隔内。

答案 1 :(得分:1)

在日期使用TRUNC将其设置为当天的00:00。我假设你在此之后是"检查现在是否在X和Y"之间。像米克所说,以下应该是好的:

SELECT count(*) INTO v_temp_suc FROM dual 
WHERE to_char(sysdate, 'HH24:MI') 
BETWEEN i.open AND i.gesloten;

但是您还需要注意,您可能会在游标中循环遍历多个结果。您可以获得任意数量的命中,但它只返回最后一个的结果。您已注释掉光标的伪代码部分。但是你不要忘记添加

IF v_temp_suc != 0 THEN
  EXIT;
END IF;

此外 - 根据您使用的输入类型(例如用户输入),您可能会发现它们有时会先输入较晚的时间,然后输入较早的时间。如果您经历了奇怪的结果,那就明白了。

含义:IF(2在1和3之间)给出TRUE,但IF(2在3和1之间)给出FALSE。

答案 2 :(得分:0)

根据您的帖子下面的评论,您说您只对比较时间部分感兴趣。所以在这种情况下,您可以这样做:

select * INTO v_temp_suc from dual 
WHERE sysdate
BETWEEN TO_DATE(to_char(sysdate, 'YYYY-MM-DD ') || i.open, 'YYYY-MM-DD HH24:MI') 
AND TO_DATE(to_char(sysdate, 'YYYY-MM-DD ') || i.gesloten, 'YYYY-MM-DD HH24:MI');

这假定i.openi.geslotenvarchar,并且它们的格式为HH24:MI

我确信有更好的方法可以做到这一点,但这至少应该有效。