PostgreSQL - 将时间与值进行比较> 24:00

时间:2013-06-04 09:06:01

标签: postgresql time-and-attendance

我正在开发一个使用PHP和PostgreSQL作为数据库的考勤应用程序。

这是我的表:

  • ID - int,PK
  • 姓名 - 字符变化(50)
  • 没有时区的及时
  • 没有时区的出门时间

基本上,我想检查在指定时间内有多少人。 例如,如果输入为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添加另一列?存储有关日期的信息?

抱歉我的英文。

1 个答案:

答案 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