我正在使用 PHP 开发一个考勤应用程序,并将 PostgreSQL 作为数据库。
这是我的表格:
- ID - 整数,PK
- 姓名 - 性格不同(50)
- In - 没有时区的时间
- Out - 没有时区的时间
基本上,我想检查指定时间内有多少人。 例如输入08:00,则统计08:00前签到08:00后 checkout 的所有人员。
我遇到的问题是Out < In,即00:00前签到,00:00后 checkout 。 我尝试使用以下 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 的值进行比较。
Query failed: ERROR: date/time field value out of range: "35:11:00"
除了为 DateIn 和 DateOut 添加另一列之外,谁能帮我解决这个问题? 存储有关日期的信息?
对不起我的英语。
最佳答案
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
关于PostgreSQL - 将时间与值进行比较 >24 :00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16913775/