【问题标题】:Get data between dates and null获取日期和空之间的数据
【发布时间】:2015-05-15 20:44:16
【问题描述】:

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

表格:

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

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

【问题讨论】:

    标签: mysql date join


    【解决方案1】:

    试试这个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'
          )
    

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

    【讨论】:

    • 太棒了!那么括号中的部分是 IF 子句?
    • @Pero 。 . .括号中的部分实现了till日期可以满足三个条件中的任何一个的逻辑。 WHEREIF 不完全相同; WHERE 正在逐行过滤数据。
    【解决方案2】:
    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 OR details.details_valid_till IS NULL OR details.details_valid_till = '0000-00-00 00:00:00')
    customer.customer_id = givenID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2019-04-19
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2016-04-17
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多