我有一个设置员工签到记录,如下表:
Table: ChkIn
ciid | stfid | cidt
-----------------------------------
1 | 1 | 2015-03-07 09:28:35
2 | 18 | 2015-03-07 09:31:30
3 | 68 | 2015-03-07 09:33:02
(omitted ...)
361 | 968 | 2015-03-11 09:34:15
362 | 18 | 2015-03-11 09:35:01
363 | 322 | 2015-03-11 09:37:38
364 | 169 | 2015-03-11 09:41:23
365 | 224 | 2015-03-11 09:48:04
ci = 签入
stf = 员工
dt = 日期时间
现在我想为早上(09:30:00 到 11:59:59 之间)、早到(09:29:59 或之前)以及下午(12:00:00 或之后)签入的记录生成一份报告(或者你可以说它是一个列表)。
我遇到了数据不准确的问题(我知道为什么它不准确,但我不知道如何解决它们)。例如,我想要从 2014 年 1 月 1 日到 2015 年 3 月 31 日的日期范围,并且它们准时到达:
SELECT c.stfid, c.cidt, s.name
FROM ChkIn c, Staff s
WHERE c.stfid = s.stfid
AND YEAR(c.cidt) >= '2014'
AND YEAR(c.cidt) <= '2015'
AND MONTH(c.cidt) >= '1'
AND MONTH(c.cidt) <= '3'
AND HOUR(c.cidt) >= '9'
AND HOUR(c.cidt) <= '11'
AND MINUTE(c.cidt) >= '30'
AND MINUTE(c.cidt) <= '59'
对于 SQL 专家,您可能已经知道这个问题:
1. 2014年4月至2014年12月的记录=>排除
2. 0 - 30 分钟内的任何小时 => 排除
所以。。。如何解决?
我不想将日期时间分成 2 列。但是如果你能为PHP代码提供一个过滤器,对我来说还是可以的。提前感谢!
TIME() 函数提取 DATETIME 列的 DATE 和 TIME 部分,然后您只能对该部分进行比较。
例如,您可以这样做;
WHERE
(DATE(cidt) BETWEEN '2014-01-01' AND '2015-03-01')
AND
(TIME(cidt) BETWEEN '09:30:00' AND '11:59:59')
看:http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_timestampdiff
试试这个:
select * from ChkIn c, Staff s WHERE c.stfid = s.stfid
where YEAR(c.cidt) <= 2015
and (case when YEAR(c.cidt) = 2014 then month(c.cidt) <= 3 else month(c.cidt) = month(c.cidt) end )
and HOUR(c.cidt) >= 9 AND HOUR(c.cidt) <= 11
AND MINUTE(c.cidt) >= 30 AND MINUTE(c.cidt) <= 59;
在您的系统上尝试此查询
SELECT temp.* FROM
(
SELECT
c.stfid,
c.cidt,
s.name
FROM
ChkIn c,
Staff s
WHERE c.stfid = s.stfid
c.cidt BETWEEN '2014-01-01 00:00:00'
AND '2014-12-31 23:59:59'
) AS temp WHERE MONTH(temp.cidt) >0 AND MONTH(temp.cidt)< 4