使用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中时间戳处理的更多信息:
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;