Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Sql 如何在oracle中获取开始日期和结束日期之间的输入日期如果输入日期不可用,则返回最大日期记录_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 如何在oracle中获取开始日期和结束日期之间的输入日期如果输入日期不可用,则返回最大日期记录

Sql 如何在oracle中获取开始日期和结束日期之间的输入日期如果输入日期不可用,则返回最大日期记录,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,请查看随附的样本数据。 场景1:如果我提供的输入日期为'20年8月21日',并且它满足两个累计id,那么我希望获取有效结束时的最大记录。i、 eabcd。 场景2:如果我提供了一个日期“20年8月26日”,并且在任何一行中都不令人满意,那么它应该返回最大有效结束日期记录。i、 eabce 我已经获取了相同的数据,并从中创建了一个表demo。看 你能试试下面的查询吗 WITH data AS (SELECT DATE '2020-08-14' input FROM dual) --input p

请查看随附的样本数据。 场景1:如果我提供的输入日期为'20年8月21日',并且它满足两个累计id,那么我希望获取有效结束时的最大记录。i、 eabcd。 场景2:如果我提供了一个日期“20年8月26日”,并且在任何一行中都不令人满意,那么它应该返回最大有效结束日期记录。i、 eabce


我已经获取了相同的数据,并从中创建了一个表
demo
。看

你能试试下面的查询吗

WITH data AS
 (SELECT DATE '2020-08-14' input FROM dual) --input parameter 
SELECT arng_id,st_dt,end_dt
FROM   (SELECT input
              ,demo.*
              ,MAX(end_dt) over(ORDER BY NULL) max_dt --taken max(end_dt) to match in case no result with input parameter
        FROM   demo
              ,data)
WHERE  (input BETWEEN st_dt AND end_dt)  -- matches with input paramater OR
OR     (max_dt BETWEEN end_dt AND input) -- condition when no result with first match 
ORDER  BY end_dt DESC -- order by require to fetch the max record always
FETCH  FIRST 1 ROW ONLY --oracle 12c feature
对于11g,我们可以使用
ROWNUM
。看

注意:我没有考虑提供的输入小于max(end_dt)且与任何行都不匹配的情况


我用同样的数据创建了一个表
demo
。看

你能试试下面的查询吗

WITH data AS
 (SELECT DATE '2020-08-14' input FROM dual) --input parameter 
SELECT arng_id,st_dt,end_dt
FROM   (SELECT input
              ,demo.*
              ,MAX(end_dt) over(ORDER BY NULL) max_dt --taken max(end_dt) to match in case no result with input parameter
        FROM   demo
              ,data)
WHERE  (input BETWEEN st_dt AND end_dt)  -- matches with input paramater OR
OR     (max_dt BETWEEN end_dt AND input) -- condition when no result with first match 
ORDER  BY end_dt DESC -- order by require to fetch the max record always
FETCH  FIRST 1 ROW ONLY --oracle 12c feature
对于11g,我们可以使用
ROWNUM
。看

注意:我没有考虑提供的输入小于max(end_dt)且与任何行都不匹配的情况


你试过什么?哪里不起作用?嗨,Randy,我可以使用分析函数获取场景1的数据,但我无法获取第二个场景。为什么第一个场景的解决方案是abcd而不是abce?如果包含这些日期,则20年8月21日介于有效开始和有效结束之间,但abce的有效结束时间高于abcd的有效结束时间。为什么您认为需要存储过程?您使用PL/SQL标记了该问题,该问题仅用于存储过程和函数。您尝试了什么?哪里不起作用?嗨,Randy,我可以使用分析函数获取场景1的数据,但我无法获取第二个场景。为什么第一个场景的解决方案是abcd而不是abce?如果包含这些日期,则20年8月21日介于有效开始和有效结束之间,但abce的有效结束时间高于abcd的有效结束时间。为什么您认为需要存储过程?您用PL/SQL标记了该问题,该问题仅用于存储过程和函数。