Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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
Mysql 获取日期和null之间的数据_Mysql_Date_Join - Fatal编程技术网

Mysql 获取日期和null之间的数据

Mysql 获取日期和null之间的数据,mysql,date,join,Mysql,Date,Join,我必须获得客户的正确数据,这些数据可能已经过时,而不是最新的数据 表: Customer +---------------------------+---------------+------+-----+---------+ | Field | Type | Null | Key | Default | +---------------------------+---------------+------+-----+---------

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

表:

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    |
+---------------------------+---------------+------+-----+---------+
一开始我有一个日期和客户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;
选择客户。*、地址。*、详细信息*
来自客户
加入地址
ON address.customer\u id=customer.customer\u id
连接详细信息
关于details.customer.customer\u id=customer.customer.id
其中customer.customer\u valid\u from=givenDate
和address.address\u valid\u from=givenDate
AND details.details\u valid\u from=givenDate
customer.customer_id=givenID;
在我看来,缺少了一部分。 如果记录与
SELECT customer.*,address.*,details中的有效_匹配,该怎么办*
来自客户
加入地址
ON address.customer\u id=customer.customer\u id
连接详细信息
关于details.customer.customer\u id=customer.customer.id
其中customer.customer\u valid\u from=givenDate
和address.address\u valid\u from=givenDate
和details.details\u valid\u from=givenDate或details.details\u valid\u till为空或details.details\u valid\u till='0000-00-00:00:00')
customer.customer_id=givenID;

从条款中尝试此

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'
      )
其中customer.customer\u valid\u from=givenDate或
customer.customer\u valid\u till为空或
customer.customer\u有效期至='0000-00-00:00:00'
)及
address.address\u valid\u from=givenDate或
address.address\u valid\u till为空或
address.address_有效期至='0000-00-00:00:00'
)及
details.details\u valid\u from=givenDate或
details.details\u有效\u直到为空或
details.details\u有效期至='0000-00-00:00:00'
)

它只是增加了你似乎想要的逻辑。

太好了!所以括号中的部分是IF子句?@Pero。括号中的部分实现了以下逻辑:
截止日期可以满足三个条件中的任何一个<代码>其中
中的不完全相同<代码>其中逐行过滤数据。
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'
      )