djq*_*djq 4 sql postgresql time datetime
我有一个表date和time字段.我很难理解我是如何处理这个问题的,部分是因为我不明白时间如何转换为数字.我使用以下命令创建了一个表:
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手册的标识符和常量的精心编写的章节感兴趣.
虽然我们在这里,但从不使用date或time作为列名.两者都是每个SQL标准中的保留字和PostgreSQL中的类型名称.这将导致令人困惑的代码和错误消息.
我会建议只使用一个单一的timestamp列,而不是单独的date和time:你几乎肯定不希望character(100)为数据类型,不断 -尤其不适合的id列.这种空白填充类型基本上只是出于历史原因.考虑text或varchar改为:
看起来像这样:
CREATE TABLE tbl (
tbl_id text CHECK(length(id) <= 100)
, ts timestamp
);
Run Code Online (Sandbox Code Playgroud)
投射到time或date只需要这些组件的地方,它简短又便宜:
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中处理的更多信息:
| 归档时间: |
|
| 查看次数: |
9573 次 |
| 最近记录: |