我正在尝试建立一个函数来检查我的sysdate是否在HH24 24:mi上的两个数据之间。如果这是真,那么如果它不返回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;发布于 2015-06-10 09:14:59
在日期上使用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;另外,根据您使用的输入类型(如用户输入),您可能会发现它们有时会先输入较晚的时间,有时则会输入较早的时间。所以如果你正经历着奇怪的结果
意思:如果(2在1和3之间)给出真,如果(2在3和1之间)给出假。
发布于 2015-06-09 20:32:14
假设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,这取决于当前时间(数据库的时间)是否在间隔内。
发布于 2015-06-09 20:02:38
根据下面的评论你的帖子,你说你只感兴趣的时间部分时,比较。因此,在这种情况下,您也许可以这样做:
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是varchars,并且它们实际上被格式化为HH24:MI。
我相信有更好的方法来做这件事,但这至少是可行的。
https://stackoverflow.com/questions/30740671
复制相似问题