Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:检查时间是否在两个实例之间(不包括dd/mm/yyyy)_Sql_Oracle_Time_Oracle Apex - Fatal编程技术网

Oracle SQL:检查时间是否在两个实例之间(不包括dd/mm/yyyy)

Oracle SQL:检查时间是否在两个实例之间(不包括dd/mm/yyyy),sql,oracle,time,oracle-apex,Sql,Oracle,Time,Oracle Apex,我正在构建一个OracleApex应用程序,在该应用程序中,记者可以带来文章,由导演为广播选择,同时还有一个新闻阅读器(如果广播被创建,新闻阅读器可以阅读文章)。我有点陷入了以下困境: 我想创建一个Oracle SQL查询,当记录的可用性(存储在另一个表“Beschikbaarheid”中)满足给定条件时,该查询选择“user”表中记录的名字和姓氏(广播日的用户开始时间>=广播日的广播开始时间和用户结束时间不使用时间戳。使用包含日期和时间的日期字段, 有关oracle中日期字段的详细信息: 如果

我正在构建一个OracleApex应用程序,在该应用程序中,记者可以带来文章,由导演为广播选择,同时还有一个新闻阅读器(如果广播被创建,新闻阅读器可以阅读文章)。我有点陷入了以下困境:

我想创建一个Oracle SQL查询,当记录的可用性(存储在另一个表“Beschikbaarheid”中)满足给定条件时,该查询选择“user”表中记录的名字和姓氏(广播日的用户开始时间>=广播日的广播开始时间和用户结束时间不使用时间戳。使用包含日期和时间的日期字段, 有关oracle中日期字段的详细信息:

如果我答对了,您有两个数据类型为TIMESTAMP的列,您需要使用一个参数来约束它,但只使用它的每分钟小时部分

最简单的方法是使用HH:MI格式的字符串参数

 select begintijd, to_char(begintijd,'HH24:MI') begintijd_hhmi, 
 eindtijd, to_char(eindtijd,'HH24:MI') eindtijd_hhmi from tst
 where '22:00' between to_char(begintijd,'HH24:MI')  and to_char(eindtijd,'HH24:MI')
 ;
请注意,您使用带有日期掩码的字符HH24:MI来去除日期/时间中不相关的部分

一种可能更好、更灵活的方法是使用间隔s

 with t2 as (
  select 
  begintijd, begintijd - trunc(begintijd) begintijd_hhmi, 
  eindtijd, eindtijd - trunc(eindtijd) eindtijd_hhmi from tst)
 select * from t2
 where INTERVAL '22:00' HOUR TO MINUTE between begintijd_hhmi  and  eindtijd_hhmi
 ;
您可以使用时间戳和截断时间戳的差值来计算时间间隔(小时和分钟)。但是,请注意,如果时间戳可以包含秒或秒的分数,您可能需要将其删除,例如使用

 NumToDsInterVal(60*extract(hour from begintijd)+extract(minute from begintijd),'MINUTE') begintijd_hhmi

好的,所以最终,我能够解决它。在我上次的更新中,唯一持久的问题是一些变量没有发送到下一页。我无法找到问题的根本原因,所以我做了一个变通方法

正常发送到下一页的唯一变量是P91_UITZENDING(UITZENDING的主键)。幸运的是,我需要的其他变量(begintijd、eindtijd和datum)是UITZENDING的属性,因此我能够在相应页面项的源代码中使用如下语句派生它们:

SELECT to_char(begintijd,'HH24:MI')
-- replace with eindtijd for eindtijd, and for date: to_char(datum,'DD-MON-YYYY')
FROM Uitzending
WHERE id = :P91_UITZENDING
以及选择框的最终SQL查询:

SELECT voornaam || ' ' || achternaam AS display_value, id AS return_value
FROM Gebruiker
WHERE -- Other statements
AND id IN (SELECT gebruikerid 
           FROM Beschikbaarheid
           WHERE (dag = to_char(to_date(:P91_DATUM,'DD-MON-YYYY'),'fmDay','NLS_DATE_LANGUAGE=Dutch'))
           AND (
                to_date('01-01-2000' || :P91_BEGINTIJD,'DD-MM-YYYY HH24:MI') 
                BETWEEN
                to_date('01-01-2000' || to_char(begintijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
                AND
                to_date('01-01-2000' || to_char(eindtijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
               )
           AND (
                to_date('01-01-2000' || :P91_EINDTIJD,'DD-MM-YYYY HH24:MI') 
                BETWEEN 
                to_date('01-01-2000' || to_char(begintijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
                AND
                to_date('01-01-2000' || to_char(eindtijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
               )
          );
我仍然不知道为什么begintijd、eindtijd和datum没有以正常的方式发送,但至少它现在可以工作了


谢谢大家的思考和帮助!

是的,我确实在应用程序中使用了日期字段,但这(实际上是一个时间表)并不是特定于日期的。我在给定代码中仅使用时间值将值转换为日期,但我认为它仍然获得dd/mm/yyyy值(?).think?检查您的想法,如果您得到了您认为得到的结果,请使用简单的sql语句进行测试。我不是一个经验丰富的oracle用户(仅用于一个简单的应用程序),但分解sql,然后检查结果与预期结果,这让我明白了许多事情。但是,我仍然更喜欢数据类型为日期的时间表,并将值检索为仅时间格式。还要检查oracle设置的日期时间设置。您必须将其设置为NL本地。我认为您在不同的日期上存在问题/时间设置。我记得我也遇到过问题。这是一个界限。你应该扩展你的答案,在这里包含尽可能多的信息,并使用链接仅供参考。喇嘛,你是对的,它应该是一个注释,而不是答案。表
Beschikbaarheid
中的数据类型是什么?你能显示一些示例数据吗?发生了什么如果你自己运行你的sub-select,你会得到任何行吗?你的第一个
不在
语句中的目的是什么,我看不出它如何符合你的问题?dag的值是什么?
NLS\U日期语言是否匹配?注意,
到字符(…,'Day'))
用空格填充正确的空格,尝试
TO_CHAR(…,'fmDay')
WW:NOT IN与这个问题不太相关,我想我必须把它删掉。我只是复制粘贴了整个lov源代码。关于Beschikbaarheid,该表包括一个FK用户ID、一周中的一天的名称(荷兰语)以及开始和结束时间(两个时间戳都是atm)。您的sql语句没有限制。我已经看到了一个包含143行(真的!)行的sql演示……请提供一些演示数据和相关的数据库架构,以便我们可以为您测试/复制答案。谢谢,我明天会尝试。尽管我认为这不会解决参数不发送的问题?
SELECT to_char(begintijd,'HH24:MI')
-- replace with eindtijd for eindtijd, and for date: to_char(datum,'DD-MON-YYYY')
FROM Uitzending
WHERE id = :P91_UITZENDING
SELECT voornaam || ' ' || achternaam AS display_value, id AS return_value
FROM Gebruiker
WHERE -- Other statements
AND id IN (SELECT gebruikerid 
           FROM Beschikbaarheid
           WHERE (dag = to_char(to_date(:P91_DATUM,'DD-MON-YYYY'),'fmDay','NLS_DATE_LANGUAGE=Dutch'))
           AND (
                to_date('01-01-2000' || :P91_BEGINTIJD,'DD-MM-YYYY HH24:MI') 
                BETWEEN
                to_date('01-01-2000' || to_char(begintijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
                AND
                to_date('01-01-2000' || to_char(eindtijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
               )
           AND (
                to_date('01-01-2000' || :P91_EINDTIJD,'DD-MM-YYYY HH24:MI') 
                BETWEEN 
                to_date('01-01-2000' || to_char(begintijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
                AND
                to_date('01-01-2000' || to_char(eindtijd,'HH24:MI'),'DD-MM-YYYY HH24:MI')
               )
          );