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'
)