如何删除时间戳等于2018的记录

时间:2019-01-18 09:39:56

标签: sql postgresql date-arithmetic

我有一个带有表absences的Postgres数据库。我正在尝试删除所有时间戳中带有“ 2018”的记录,如下所示:

DELETE FROM absences WHERE date LIKE '%2018%';

但我收到此错误消息:

absence-registrator_production=> DELETE FROM absences WHERE date LIKE '2018%';
ERROR:  operator does not exist: timestamp without time zone ~~ unknown
LINE 1: DELETE FROM absences WHERE date LIKE '2018%';

有人知道如何从缺席表中删除日期字段中带有“ 2018”的记录吗?

3 个答案:

答案 0 :(得分:3)

另一种选择是使用可能会利用该列上的索引的条件:

where date >= timestamp '2018-01-01 00:00:00' 
  and date < timestamp '2019-01-01 00:00:00';

如果您不想写一个很长的“时间戳文字”,而只是将数字传递给查询,则可以使用make_timestamp()

where date >= make_timestamp(2018,1,1,0,0,0) 
  and date < make_timestamp(2019,1,1,0,0,0);

如果该值是参数,则可以使用:

where date >= make_timestamp(?,1,1,0,0,0) 
  and date < make_timestamp(? + 1,1,1,0,0,0);

提取功能也可以工作:

where extract(year from date)::int = 2018

或使用to_char()

where to_char(date, 'yyyy') = '2018'

答案 1 :(得分:1)

也许date_trunc是最简单的方法:

WHERE date_trunc('year', date) = TIMESTAMPTZ '2018-01-01 00:00:00'

extract也是一个不错的主意,但是它返回一个double precision,对于将它们与=进行比较,我感到不安。

答案 2 :(得分:0)

感谢您的帮助。我使用此查询解决了我的问题:

从缺勤中删除WHERE EXTRACT(从“日期”开始的年份)= 2018;