0

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

这是我的桌子:

  • ID - 整数,PK
  • 名称 - 字符变化(50)
  • 及时无时区
  • Out - 没有时区的时间

基本上,我想检查指定时间内有多少人。例如,如果输入是 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 无法将时间与>24:00 的值进行比较。

查询失败:错误:日期/时间字段值超出范围:“35:11:00”

除了为 DateIn 和 DateOut 添加另一列之外,谁能帮我解决这个问题?存储有关日期的信息?

对不起我的英语不好。

4

1 回答 1

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数据类型表示的持续时间。

如果您将表定义从 更改timeinterval,则可以使用如下输入:

and "In" < interval '35:11:00' minute
于 2013-06-04T09:34:44.260 回答