mysql选择日期时间字段小于指定值的所有记录


mysql select all records where a datetime field is less than a specified value

因此,我正在尝试运行一个查询,在这种情况下,该查询将选择尚未预约的客户是X时间量(例如2周)。它可以归结为"给我看一份两周内没有预约的客户名单"。我试图在php中通过做一些类似的事情来解决这个问题:

$date = new DateTime;
$ago = new DateInterval('P2W');
$target = $date->sub($ago);
//query to select clients that aren't scheduled after the $target date
$clients = ...;

涉及两个表,appt_tblclients_tblappt_tbl为每个约会记录存储一个client_id。

所以本质上,我需要的是为每个客户选择"最大"约会,如果是<我的$target日期,将它们包含在查询结果中。我尝试过各种风格的查询,带子查询的查询,但我在正确处理这个查询方面遇到了困难。

我目前的尝试看起来像:

SELECT * 
FROM clients_tbl 
INNER JOIN
(
    SELECT client_id 
    FROM appt_tbl 
    WHERE MAX(appt_date_time) < '2012-07-22' 
    GROUP BY client_id
) appts ON appts.client_id = clients_tbl.client_id;

这也应该包括从未被安排的客户(IE不会出现在appt_tbl中),但不包括在未来两周内预约的客户。

SELECT a.*
FROM clients_tbl a
LEFT JOIN appt_tbl b ON 
          a.client_id = b.client_id AND 
          b.appt_date_time >= CURDATE() - INTERVAL 2 WEEK 
WHERE b.client_id IS NULL

此查询首先要做的是(在WHERE筛选之前)选择所有客户端,无论它们是否有两周以上的预定约会。

如果客户端在两周前没有约会,则联接表中的值将为NULL。我们想要所有联接条件不满足的行(即联接表中的值为空),这是用WHERE b.client_id IS NULL完成的。

这还将根本没有任何相应约会的客户端包括在结果集中。

将来有预约的客户将被排除在外。

也不需要在PHP中构造日期时间字符串。您可以直接在查询中执行此操作(尽管您可以将周数作为参数传入)。

我认为这可能很简单。

select users from time_sheet where created_date >= date('2013-12-01');

在你的情况下,你必须这样做。而不是这个

WHERE MAX(appt_date_time) < '2012-07-22' 

做这个

WHERE MAX(appt_date_time) < date('2012-07-22')

这敏锐地做了日期比较,较早的是日期与字符串的比较。

干杯!!