mysql - 获取日期和 null 之间的数据

标签 mysql date join

我必须获得客户的正确数据,这些数据可能已经过时,而不是最新的数据。

表格:

Customer
+---------------------------+---------------+------+-----+---------+
| Field                     | Type          | Null | Key | Default |
+---------------------------+---------------+------+-----+---------+
| customer_id               | int(11)       | NO   | PRI | NULL    |
| customer_data             | varchar(255)  | NO   |     | NULL    |
| customer_valid_from       | datetime      | NO   |     | NULL    |
| customer_valid_till       | datetime      | YES  |     | NULL    |
+---------------------------+---------------+------+-----+---------+

Address
+---------------------------+---------------+------+-----+---------+
| Field                     | Type          | Null | Key | Default |
+---------------------------+---------------+------+-----+---------+
| address_id                | int(11)       | NO   | PRI | NULL    |
| address_street            | varchar(255)  | NO   |     | NULL    |
| address_valid_from        | datetime      | NO   |     | NULL    |
| address_valid_till        | datetime      | YES  |     | NULL    |
| customer_id               | int(11)       | NO   |     | NULL    |
+---------------------------+---------------+------+-----+---------+

Details
+---------------------------+---------------+------+-----+---------+
| Field                     | Type          | Null | Key | Default |
+---------------------------+---------------+------+-----+---------+
| detail_id                 | int(11)       | NO   | PRI | NULL    |
| detail_street             | varchar(255)  | NO   |     | NULL    |
| detail_valid_from         | datetime      | NO   |     | NULL    |
| detail_valid_till         | datetime      | YES  |     | NULL    |
| customer_id               | int(11)       | NO   |     | NULL    |
+---------------------------+---------------+------+-----+---------+

一开始我得到了一个日期和 customer_id。 现在我想选择所有数据,这些数据涉及在该日期具有给定 customer_id 的客户,该日期也已给出。

我的 SQL 目前看起来像这样:

SELECT customer.*,address.*,details.*
FROM customer
JOIN address
ON address.customer_id = customer.customer_id
JOIN details
ON details.customer.customer_id = customer.customer.id
WHERE customer.customer_valid_from <= givenDate
AND customer.customer_valid_till >= givenDate
AND address.address_valid_from <= givenDate
AND address.address_valid_till >= givenDate
AND details.details_valid_from <= givenDate
AND details.details_valid_till >= givenDate
customer.customer_id = givenID;

在我看来,有一个部分缺失了。 如果一条记录与 valid_from <= GiveDate 匹配,但 valid_till 为 NULL 或“0000-00-00 00:00:00”怎么办?

我考虑过 IF 或 CASE 子句,但我使用 MySQL 的经验并不令人满意。

最佳答案

试试这个 from 子句:

WHERE customer.customer_valid_from <= givenDate AND
      (customer.customer_valid_till >= givenDate OR
       customer.customer_valid_till IS NULL OR
       customer.customer_valid_till  = '0000-00-00 00:00:00'
      ) AND
      address.address_valid_from <= givenDate AND
      (address.address_valid_till >= givenDate OR
       address.address_valid_till IS NULL OR
       address.address_valid_till = '0000-00-00 00:00:00'
      ) AND
      details.details_valid_from <= givenDate AND
      (details.details_valid_till >= givenDate OR
       details.details_valid_till IS NULL OR
       details.details_valid_till = '0000-00-00 00:00:00'
      )

它只是添加了您似乎要求的逻辑。

关于mysql - 获取日期和 null 之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29031029/

相关文章:

MySQL : Get segmented records between multiple date range

linux - 从 shell 脚本解析日期以计算证书到期前的天数

php - 未选择日期时将 1970-01-01 插入数据库

firebase - 如何在 firestore 中加入集合

mysql - 来自多个 JOINed 表 MSSQL 的 SUM

mysql - ActiveRecord 的分布式事务边界

MySQL InnoDB VARCHAR 性能与插入时的 TEXT

java - 检查 MySql 数据库的表中的一行或行范围是否被锁定?

android - 如何为糖 ORM 查询做日期条件

php - 从 53 个表返回 mysql 数据库的 p_id 和 t_id 记录?