我正在尝试创建一个函数来检查我的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;
答案 0 :(得分:2)
假设i.open
和i.gesloten
中的数据格式为HH24:MI
(10
之前的小时为零填充),您可以在过程中使用此查询:
SELECT count(*) INTO v_temp_suc FROM dual
WHERE to_char(sysdate, 'HH24:MI')
BETWEEN i.open AND i.gesloten;
查询将返回0
或1
,具体取决于(数据库的)当前时间是否在该时间间隔内。
答案 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.open
和i.gesloten
为varchar
,并且它们的格式为HH24:MI
。
我确信有更好的方法可以做到这一点,但这至少应该有效。