MySQL SELECT DateTime (員工檢查報告)


MySQL SELECT DateTime (Staff Check-In Report)

我有一个设置员工签到记录,如下表:

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代码提供一个过滤器,对我来说还是可以的。提前感谢!

您可以使用 DATE() 和

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