1

我有一个带有 unix 格式的 lastaccess 日期的表。我想查询表中lastaccess日期大于180天的所有记录。

这是我当前的查询

SELECT  id, auth, username, IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual'

我需要能够使用 NotAccessedIn6Months 结果来过滤结果集,例如

SELECT  id, auth, username, IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual' AND NotAccessedIn6Months = 'Y'

但后一种格式是非法的。

谢谢你。

4

5 回答 5

2

您有两个选择:要么使用 HAVING 而不是 WHERE,如下所示:

SELECT id, auth, username, 
       IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
  FROM mdl_user 
 WHERE auth = 'manual' 
HAVING NotAccessedIn6Months = 'Y'

...或者只是将此条件移动到 WHERE 中(因为在此特定查询中根本不会显示 'N' 值),如下所示:

SELECT id, auth, username 
  FROM mdl_user 
 WHERE auth = 'manual' 
   AND DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess)) >= 180
于 2012-07-03T17:02:38.920 回答
2

你不能在 WHERE 子句中结合它:

SELECT  id, auth, username
FROM  mdl_user 
WHERE auth = 'manual' AND DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180
于 2012-07-03T17:03:50.067 回答
1

HAVING 为 SELECT 语句中使用的组或聚合函数指定搜索条件。

SELECT  id,
        auth,
        username,
        IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N')
            As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual'
HAVING NotAccessedIn6Months = 'Y'
于 2012-07-03T17:01:54.373 回答
1

您不能在 WHERE 中使用计算值别名,但可以在 HAVING 子句中使用。但是,这会对性能产生影响,因为 HAVING 不会在查询时过滤,而是在整个结果集上过滤。

于 2012-07-03T17:03:12.633 回答
0
SELECT  id, auth, username
FROM  mdl_user 
WHERE auth = 'manual' AND lastaccess < UNIX_TIMESTAMP(CURRENT_DATE - interval 180 DAY)

您也可以使用CURRENT_TIMESTAMP而不是CURRENT_DATE

于 2012-07-03T17:27:55.143 回答