使用PostgreSQL处理时间

使用PostgreSQL处理时间,sql,postgresql,datetime,time,Sql,Postgresql,Datetime,Time,我有一个带有日期和时间字段的表。我很难理解我是如何处理这个问题的,部分原因是我不明白时间是如何转换成数字的。我使用以下命令创建了一个表: CREATE TABLE tracking.time_record ( date date, "time" time without time zone, id character(100) ) 我的数据示例如下: "2012-04-18" | "18:33:19.612" | "2342342384" 例如,如何运行查询,以便在某一天检查

我有一个带有
日期
时间
字段的表。我很难理解我是如何处理这个问题的,部分原因是我不明白时间是如何转换成数字的。我使用以下命令创建了一个表:

CREATE TABLE tracking.time_record
(
  date date, 
  "time" time without time zone,
  id character(100)
)
我的数据示例如下:

"2012-04-18" | "18:33:19.612" | "2342342384" 
例如,如何运行查询,以便在某一天检查具有时间值
>10 pm
的所有
id

我意识到,由于我的时间存储在字符类型变量中,因此类似的东西不起作用:

SELECT * FROM tracking.time_record 
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"
(这是我第一次探索时间/日期跟踪-我可能应该选择不同的列名)

您可以使用该函数获取小时

select id 
from tracking.time_record
where date_part('hour', time) >= 22
  and date = '2012-04-18'
>=22而不是>22,这是为了捕捉晚上10点到11点之间的间隔时间。这也赶上了晚上10:00:00。但是调整查询以捕捉正确的时间间隔并不难


您有一个工作示例。

比较时间和日期值在postgresql中应该可以正常工作,只需确保将字符串转换为适当的类型:

SELECT * FROM tracking.time_record 
WHERE "time" > time '04:33:38.884' AND "date" > date '2012-04-18'

到目前为止,这两个答案都没有抓住你的实际问题

虽然显式转换为适当的类型肯定不会有什么坏处,但这并不是必需的。PostgreSQL自动将字符串文字强制为适当的类型

您的问题源于基本语法错误:
双引号用于标识符
“MyColumn”
-并且仅用于其他非法标识符(大小写混合、保留字等),应避免使用这些标识符。
单引号用于
“字符串文字”

您可能会对PostgreSQL手册中写得很好的章节感兴趣

当我们使用时,千万不要使用
日期
时间
作为列名。它们都存在于每个SQL标准和PostgreSQL中的类型名称中。这将导致混淆代码和错误消息

我建议只使用一个
时间戳
列,而不是单独的
日期
时间
: 而且您几乎肯定不希望
字符(100)
作为数据类型,尤其是对于
id
列。这种空白填充类型基本上只是出于历史原因。考虑<代码>文本< /代码>或<代码> VARCHAR < /代码>代替:

可能是这样的:

CREATE TABLE tbl (
   tbl_id text CHECK(length(id) <= 100)
 , ts timestamp
);
使用或用于更具体的需要。
查询。。。在某一天时间值>晚上10点的id值:

或者,对于任何连续时间段:

...
WHERE  ts > '2012-04-18 22:00'::timestamp
AND    ts < '2012-04-19 00:00'::timestamp;
。。。
其中ts>'2012-04-18 22:00'::时间戳
和ts<'2012-04-19 00:00':时间戳;
第二种形式可以更好地在
ts
上使用普通索引,并且在这种情况下对于大型表会更快

有关PostgreSQL中时间戳处理的更多信息:


为什么不将日期+时间组合成带/不带时区的时间戳?这将使比较更容易,而且如果你想要的话,你可以随时提取相关部分。这是一个很好的观点。现在我对时间戳的工作原理有了更好的了解,我以后会这样做。请注意,这将在凌晨4:33之后找到2012-04-18的记录。(因此,在那一天之前,以及在任何一天的凌晨4:33之前,都没有任何内容)。您可能需要的是一个时间戳列。在这种情况下不需要强制转换(虽然没有伤害)。Postgres在此自动将字符串文本强制为匹配类型。语法错误是问题所在。你说得对。我仍然会推荐演员。是比较字符串还是日期还是其他?如果不看表规范,您真的无法判断。
date\u part()
也不是必需的<代码>“时间”>“22:00”就可以了。顺便说一句,我怀疑您是否真的想要
字符(100)
作为您的
id
。这种空白填充类型基本上只是出于历史原因。换个角度考虑。
SELECT *
FROM   tbl
WHERE  ts::time > '22:00'
AND    ts::date = '2012-04-18';
...
WHERE  ts > '2012-04-18 22:00'::timestamp
AND    ts < '2012-04-19 00:00'::timestamp;