【问题标题】:PostgreSQL - Comparing time with value >24:00PostgreSQL - 将时间与 >24:00 的值进行比较
【发布时间】:2013-06-04 18:00:06
【问题描述】:

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

这是我的桌子:

  • ID - 整数,PK
  • 名称 - 字符不同 (50)
  • 及时无时区
  • 超时 - 没有时区的时间

基本上,我想检查指定时间内有多少人。 例如,如果输入的是 08:00,那么所有在 08:00 之前签到和在 08:00 之后签退的人都会被计算在内。

我遇到的问题是当Out

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 添加其他列之外,谁能帮我解决这个问题? 存储有关日期的信息?

对不起我的英语。

【问题讨论】:

  • 您的 $input 似乎有问题。
  • 您是否要求inout 的类型为time?是否可以选择使用timestamp,从而将日期信息添加到您的值中?我希望这比使用纯 time 值的任何解决方法都好。
  • @Thilo 你能给我一些使用时间戳进行时间比较的例子吗?我不能让输入存储固定日期。我需要 - 比方说 - 将输入与整个表格进行比较。
  • 避免使用 time 数据类型。出于这个原因,这是一种痛苦。存储 timestamp with time zone 获取真实世界时间,或存储 interval 获取时差。

标签: postgresql time-and-attendance


【解决方案1】:

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

【讨论】:

  • “分钟”不应该是“小时”吗? :-)
  • @Denis:既然你提到了它......但它确实对我有用:sqlfiddle.com/#!12/d41d8/960
  • 嗯,我的输入只存储“hh:mm:ss”值,而我的表不使用时间戳——它只存储时间......我可以像and "In" &lt; date "Out" + interval '35:11:00' minute那样做吗?
  • @BrianSumali:啊,我错过了。但我想你将不得不改变你处理“时间”的方式。听起来你实际上想要一个 interval 而不是 time
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多