Postgresql - 选择日期="01/01/11"的东西

Abr*_*odj 40 sql postgresql datetime

我的Postgresql中有一个datetime字段,名为"dt".我想做点什么

SELECT * FROM myTable WHERE extract (date from dt) = '01/01/11'
Run Code Online (Sandbox Code Playgroud)

这样做的正确语法是什么?

谢谢!

mu *_*ort 81

我想你想你的投dtdate并解决您的日期文字的格式:

SELECT *
FROM table
WHERE dt::date = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD
Run Code Online (Sandbox Code Playgroud)

标准版:

SELECT *
FROM table
WHERE CAST(dt AS DATE) = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD
Run Code Online (Sandbox Code Playgroud)

extract函数不理解"日期"并返回一个数字.

  • 一个补充:如果时间戳字段已编制索引,则使用dt :: date或CAST(dt AS date)可防止使用索引.另一种方法是在dt :: date上构建一个函数索引或者以这种方式编写它(使用参数$ 1作为日期字符串):WHERE dt> = $ 1 AND dt <$ 1 + interval'1 day'. (10认同)

Hug*_*ugh 12

PostgreSQL 有许多可用的日期/时间函数,请参见此处

在您的示例中,您可以使用:

SELECT * FROM myTable WHERE date_trunc('day', dt) = 'YYYY-MM-DD';
Run Code Online (Sandbox Code Playgroud)

如果您定期运行此查询,也可以使用该date_trunc函数创建索引:

CREATE INDEX date_trunc_dt_idx ON myTable ( date_trunc('day', dt) );
Run Code Online (Sandbox Code Playgroud)

这样做的一个优点是,如果需要,时区具有更大的灵活性,例如:

CREATE INDEX date_trunc_dt_idx ON myTable ( date_trunc('day', dt at time zone 'Australia/Sydney') );
SELECT * FROM myTable WHERE date_trunc('day', dt at time zone 'Australia/Sydney') = 'YYYY-MM-DD';
Run Code Online (Sandbox Code Playgroud)