Oracle查询计算与日期数组完全相同的匹配

Posted

技术标签:

【中文标题】Oracle查询计算与日期数组完全相同的匹配【英文标题】:Oracle query to count exactly same match with array of dates 【发布时间】:2021-03-30 14:53:16 【问题描述】:

有一个包含以下两个表的 Oracle 数据库。连接是1:n,所以一个企业可以有很多订单。

现在我必须编写一条 SQL 语句,用于检查是否存在给定名称下的业务,以及预定义的订单日期是否存在。

示例: 我们有名为“B1”的业务,该业务有两个“订单”,分别为“2020 年 7 月 4 日”和“2021 年 3 月 1 日”。 比方说,我有一个名称“B1”和一个输入集('7/4/2020'、'8/1/2021'),它应该返回一些信号,表明“具有这些订单日期的 B1 不存在”。但是名称“B1”和输入集('3/1/2021', '7/4/2020')返回“B1 已经存在这些订单日期”。

我的问题:我没有找到正确的语法。如何在“IN”运算符的输入集中使用日期?这样做最有效的想法是什么?

【问题讨论】:

在您的查询中是“输入集”字符串列表? 在普通的 SQL 查询中,您会写类似 where order date in (date '2020-07-04', date '2021-01-03') 的内容,但由于您引用“输入集”、“数组”和“SQL Developer”,因此不清楚您要做什么或什么不起作用。 【参考方案1】:

如果您总是比较两个订单日期,那么试试这个:

架构和插入语句:

 create table business_data (id int ,name varchar(50));
 CREATE TABLE ORDERS (ID INT, ORDERDATE DATE, BUSINESS_ID INT);

 INSERT INTO BUSINESS_DATA VALUES (1,'B1');

 INSERT INTO orders VALUES (1,'3-jan-2021',1);
 INSERT INTO orders VALUES (2,'7-apr-2020',1);
 INSERT INTO orders VALUES (3,'7-may-2020',1);

查询#1(匹配订单日期)

 select (case when count(*)>0 then (max(name)||' with exactly these order dates already exist') else (max(name)||' with exactly these order dates not exist')  end)as results from business_data b 
 where b.name='B1' and exists 
            (
               select 1  from orders o where b.id=o.business_id and o.orderdate = any ('3-jan-2021', '7-apr-2020') 
            group by business_id
            having count(distinct orderdate)>=2
            )
RESULTS
B1 with exactly these order dates already exist

查询#2(订单日期不匹配)

 select (case when count(*)>0 then (max(name)||' with exactly these order dates already exist') else (max(name)||' with exactly these order dates not exist')  end)as results from business_data b 
 where b.name='B1' and exists 
            (
               select 1  from orders o where b.id=o.business_id and o.orderdate = any ('3-jan-2021', '8-apr-2120') 
            group by business_id
            having count(distinct orderdate)>=2
            )

输出:

RESULTS
with exactly these order dates not exist

db小提琴here

【讨论】:

以上是关于Oracle查询计算与日期数组完全相同的匹配的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql 错误 : ORA-01861: 文字与格式字符串不匹配和日期与字符串互转问题解决

php ORA-01861: 文字与格式字符串不匹配

oracle把查两个日期相减的天数变成数字类型

对 Oracle 的 EF 查询抛出“ORA-12704:字符集不匹配”

ORA-00936 在 oracle 选择语句中使用日期函数时

尽管列和值匹配,Oracle 给我错误 ORA-00947