使用 MYSQL 和 VB 获取存在于一个表中但不存在于另一个表中的日期

Getting dates that exist in one table but not the other table using MYSQL and VB

提问人:Zcast 提问时间:10/30/2023 最后编辑:Zcast 更新时间:11/1/2023 访问量:69

问:

我知道论坛上有很多关于这个问题的答案,但我根本无法弄清楚我做错了什么。我尝试了很多方法,有些方法让我接近,但不是一路走来。

我有两张表:

“出勤”,包含三个字段“ID”、“DLNumber”、“Time”

带有 2 个字段“ID、时间”的“日历”

我想发生的事情

我正在尝试查找日历表中存在的日期,而出勤表中不存在这些日期。

我需要搜索两个日期之间的出勤率以及与驾照号码匹配的内容。然后将该查询的结果与日历中的日期进行比较。

我试过:

Dim sql As String = "SELECT calendar.Time FROM calendar WHERE 
calendar.Time NOT IN (SELECT attendance.Time FROM attendance WHERE 
attendance.DLNumber=?DL AND attendance.Time>= ?ST And 
attendance.Time < ?ET)"

当我运行此查询时,我在 2023-10-23 和 2023-10-27 这两个日期之间进行搜索,结果是 都是四个日期,我需要“2023-10-24”作为结果。 没有运气。

我试过:

Dim sql As String = "Select calendar.Time,attendance.Time From calendar " _
& "Left Join attendance On attendance.time = calendar.Time WHERE 
attendance.DLNumber=?DL AND attendance.Time>= ?ST And 
attendance.Time < ?ET  Order BY calendar.Time"

相同的结果。

我确定我没有正确解释这一点,所以请原谅我对 MYSQL 的无知,我是新手。

好的,这让我得到了在所选时间范围内的所有日期:

还行。。。因此,这让我在选定的时间范围内从一个表匹配到另一个表的所有日期:

 Select calendar.Date,attendance.Date From calendar 
Left Join attendance On attendance.Date = calendar.Date WHERE 
attendance.DLNumber=?DL AND attendance.Date> ?ST And 
attendance.Date <=?ET AND  calendar.Date> ?ST And 
calendar.Date <= ?ET Order BY calendar.Date 

如何获取给定时间范围内不匹配的日期?

因此,几乎从两个表中获取从 10-23-23 到 10-30-23 的所有日期,并将它们进行比较以获取出勤表中缺少哪些日期,而日历表中缺少哪些日期......

mysql vb.net 日期 比较

评论

0赞 FanoFN 10/30/2023
当您处理右侧表中的任何列时,只需将其转换为普通联接即可。尝试更改为作为条件的延续。所以,而不是 ,做LEFT JOINWHEREWHEREANDONOn attendance.time = calendar.Time WHERE attendance.DLNumber=?DL ...On attendance.time = calendar.Time AND attendance.DLNumber=?DL ...
0赞 FanoFN 10/30/2023
顺便问一下,列存储什么?您最好向我们展示两个表的表结构,并包含一些数据样本以进行澄清。你可以通过运行TimeSHOW CREATE TABLE table_name;
1赞 Zcast 10/30/2023
时间列实际上是日期时间类型的列.....
1赞 Zcast 10/30/2023
它们都是日期时间类型,包括时间...
1赞 Zcast 11/1/2023
还行。。。因此,这让我在所选时间范围内从一个表匹配到另一个表的所有日期:选择日历。日期,出席情况。日期 从日历 左 加入考勤 考勤。日期 = 日历。日期 WHERE 出席。DLNumber=?DL 和出勤率。日期> ?ST 和出勤率。日期 <=?ET AND 日历。日期> ?ST 和日历。日期 <= ?ET Order BY 日历。日期

答:

0赞 FanoFN 11/1/2023 #1

据我所知,您没有正确使用。而且您没有提供任何表结构或示例数据 - 您在其中显示您实际上有一个列。首先,您必须了解 a 基本上意味着“我希望左侧表中的所有内容有条件或无条件地返回结果,并根据特定列或条件返回右侧表中的任何匹配项”。只要你把表的条件严格地放在右边,就会发生这种情况。当您在 中定义引用右侧表的任何条件时,您正在从右侧的表中筛选出任何为真并取消功能的条件。LEFT JOINdateLEFT JOINONWHERELEFT JOIN

所以,你在这里做什么:

Select calendar.Date,attendance.Date From calendar 
Left Join attendance On attendance.Date = calendar.Date 
WHERE [[ attendance.DLNumber=?DL 
        AND attendance.Date> ?ST 
        And attendance.Date <=?ET ]] <--- these cancel the left join function
AND  calendar.Date> ?ST And calendar.Date <= ?ET Order BY calendar.Date 

你应该做的是:

SELECT calendar.Date,attendance.Date 
  /* table on the left */       /* table on the right */
FROM    calendar     LEFT JOIN    attendance 
 ON attendance.Date = calendar.Date 
/* continue these conditions in ON */
 AND attendance.DLNumber=?DL 
        AND attendance.Date> ?ST 
        AND attendance.Date <=?ET

/* WHERE filter here should only be for calendar table if you want to maintain the left join function */
WHERE calendar.Date> ?ST AND calendar.Date <= ?ET ORDER BY calendar.Date 

您应该看到结果与此有所不同。

下面是一个小提琴示例:https://dbfiddle.uk/K4ynr2ai