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

标签 postgresql time-and-attendance

我正在使用 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/

相关文章:

sql-server - SQL查询一个月的考勤情况

c# - 检查时间(考勤 c#)

time-and-attendance - ZKemkeeper 在重新读取 ReadGeneralLogData 时花费很长时间

Postgresql-仅在以下情况下才合并来自多个表的数据

database - 如何将数据库置于 git(版本控制)之下?

node.js - Openwhisk 无法调用 compose postgresql

MySQL考勤 "parse filter"类型和状态

database-design - 优化模式以捕获出勤数据的最佳方法是什么

sql - 插入返回类型?

python - Django 用户 ID 字段