使用PostgreSQL处理时间

djq*_*djq 4 sql postgresql time datetime

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

CREATE TABLE tracking.time_record
(
  date date, 
  "time" time without time zone,
  id character(100)
)
Run Code Online (Sandbox Code Playgroud)

我的数据示例如下:

"2012-04-18" | "18:33:19.612" | "2342342384" 
Run Code Online (Sandbox Code Playgroud)

例如,如何运行查询以便我可以检查在某一天id具有时间值的所有值> 10 pm

我意识到,因为我的时间存储在一个字符类型变量中,所以这样的东西不起作用:

SELECT * FROM tracking.time_record 
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"
Run Code Online (Sandbox Code Playgroud)

(这是我对时间/日期跟踪的第一次探索 - 我应该选择不同的列名)

Erw*_*ter 10

到目前为止,这两个答案都没有捕捉到您的实际问题.

虽然对适当类型的明确演绎当然不会受到伤害,但没有必要.PostgreSQL自动将字符串文字强制转换为适当的类型.

你的问题源于基本的语法错误:
双引号用于标识符:"MyColumn"- 只有非法非标识符(混合大小写,保留字,...)才需要开始使用.
单引号用于:'string literal'.

您可能对有关PostgreSQL手册的标识符常量的精心编写的章节感兴趣.

虽然我们在这里,但从不使用datetime作为列名.两者都是每个SQL标准中的保留字和PostgreSQL中的类型名称.这将导致令人困惑的代码和错误消息.

我会建议只使用一个单一的timestamp列,而不是单独的datetime:你几乎肯定不希望character(100)为数据类型,不断 -尤其不适合的id列.这种空白填充类型基本上只是出于历史原因.考虑textvarchar改为:

看起来像这样:

CREATE TABLE tbl (
   tbl_id text CHECK(length(id) <= 100)
 , ts timestamp
);
Run Code Online (Sandbox Code Playgroud)

投射到timedate只需要这些组件的地方,它简短又便宜:

SELECT ts::time AS the_time, ts::date AS the_date FROM tbl;
Run Code Online (Sandbox Code Playgroud)

使用date_trunc()extract()用于更具体的需求.
要查询特定日期时间值> 10 pm的 ... id值:

SELECT *
FROM   tbl
WHERE  ts::time > '22:00'
AND    ts::date = '2012-04-18';
Run Code Online (Sandbox Code Playgroud)

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

...
WHERE  ts > '2012-04-18 22:00'::timestamp
AND    ts < '2012-04-19 00:00'::timestamp;
Run Code Online (Sandbox Code Playgroud)

第二种形式可以ts更好地使用普通索引,在大型表格的情况下会更快.

有关timestampPostgreSQL中处理的更多信息: