我正在开发一个使用PHP和PostgreSQL作为数据库的考勤应用程序。
这是我的表:
基本上,我想检查在指定时间内有多少人。 例如,如果输入为08:00,那么所有在08:00之前登录并在08:00之后退出的人都将被计算在内。
我遇到的问题是Out< In,表示在00:00之前登录并在00:00之后退出的人。 我尝试使用以下SQL来解决此问题:
SELECT COUNT(*) FROM(
SELECT tbl_1."ID" FROM attendance as tbl_1 WHERE "In" < "Out" AND "In" < '$input' AND "Out" > '$input'
UNION
SELECT tbl_2."ID" FROM attendance as tbl_2 WHERE "Out" < "In" AND "In" < '$input2' AND "Out" > '$input'
) AS tmp_tbl
$ input是一个存储输入数据(字符串)的PHP变量。 $ input2是一个PHP变量,存储输入数据+24小时(我替换了前两个字符)。
但遗憾的是我遇到了另一个问题 - PostgreSQL无法将时间与价值&gt; 24:00进行比较。
查询失败:错误:日期/时间字段值超出范围:“35:11:00”
任何人都可以帮我解决这个问题,除了为DateIn和DateOut添加另一列?存储有关日期的信息?
抱歉我的英文。
答案 0 :(得分:4)
好35:11:00
不是一天中的有效时间。
我猜您的输入值类似于2013-06-01 35:11:00
,这是一个无效的时间戳(一天只有24小时),因此Postgres抱怨
您必须在PHP中计算正确的时间戳(以便传递给Postgres的实际值为2013-06-02 11:11:00
,或者您可以通过将值拆分为日期来在SQL语句中“执行”部分和间隔:
这样的事情:
and "In" < date '2013-06-01' + interval '35:11:00' minute
其中,实际值来自PHP变量(但分为两部分)。
修改强>
我错过了列定义time
(我以某种方式阅读timestamp
)。
显然你不存储“时间”(实际上是“一天中的时间”),但是可以使用interval
数据类型表示的持续时间。
如果您将表格定义从time
更改为interval
,则可以使用以下输入:
and "In" < interval '35:11:00' minute