我正在尝试从表中选择数据,在日期字段“date_checked”(时间戳)上使用“like”。但我有这个错误:
SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: timestamp without time zone
我的要求是:
SELECT my_table.id
FROM my_table
WHERE my_table.date_checker LIKE '2011-01-%'
我不想使用:
SELECT my_table.id
FROM my_table
WHERE my_table.date_checker >= '2011-01-01 00:00:00'
AND my_table.date_checker < '2011-02-01 00:00:00'
答案 0 :(得分:68)
非常好“不想使用”&lt;和&gt;带有时间戳,但这些运算符可以转换为索引扫描和字符串匹配......好吧,它可以,但是EWWWW。
嗯,发生错误是因为你需要在对它使用字符串操作之前将时间戳显式转换为字符串,例如:
date_checker::text LIKE '2011-01-%'
然后我假设然后您可以在(date_checker::text)
上创建一个索引,该表达式将成为索引扫描但是...... EWWWW。
答案 1 :(得分:8)
也许date_trunc
函数更符合您的喜好:
... WHERE date_trunc('month', my_table.date_checker) = '2011-01-01'
如果需要,您还可以在该表达式上添加索引。
答案 2 :(得分:4)
如果您需要对timestamp
的某些部分进行比较,那么使用EXTRACT()
功能要好得多。例如:
WHERE EXTRACT(YEAR FROM date_checker) = 2011
AND EXTRACT(MONTH FROM date_checker) = 1
您可以从日期中提取的不同“字段”的详细信息位于the documentation。
答案 3 :(得分:2)
我不相信您可以在日期列上执行like
而不先将其转换为字符串表示。
您可以使用between查询在两个日期之间进行选择,例如:
SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01';
答案 4 :(得分:0)
尝试一下:
SELECT my_table.id
FROM my_table
WHERE CAST(my_table.date_checker AS VARCHAR) LIKE '2011-01-%';