PostgreSQL LIKE 查询

PostgreSQL LIKE query

我想获取以“2007-02”开头的日期的销售额:

SELECT *
FROM payment
WHERE payment_date LIKE '2007%';

但是出现错误:

ERROR: ERROR: operator does not exist: timestamp without time zone ~~ unknown
LINE 9: WHERE payment_date LIKE '2007%'
                            ^
HINT: Operator with given name and argument types could not be found. Perhaps you should add explicit casts.

但另一个查询为

SELECT email
FROM customer
WHERE first_name = 'Kelly' 
AND last_name LIKE 'K%';

工作正常。我怎样才能强制这个查询工作? 你可以通过link获取我的学习数据库:https://dropmefiles.com/LX8cu

I want to get sales with date, which started with '2007-02':

LIKE 是一个 string 函数。如错误消息所示,payment_date 列是 timestamp 数据类型,因此使用日期过滤:

where payment_date >= date '2007-02-01' and payment_date < date '2017-03-01'

或者,如果您想要全年:

where payment_date >= date '2007-01-01' and payment_date < date '2018-01-01'

您可能想使用日期函数来提取日期的年份部分,并将其用于比较:

where extract(year from payment_date) = 2007

我不推荐这样做;这效率低得多,因为在过滤发生之前需要将函数应用于整个列,而不是直接过滤文字。一个说表达式不是 SARGable。

错误消息确实说明了一切 - like 运算符在其两侧都采用字符串,而您有时间戳。

另一种方法是 extract 年份:

SELECT *
FROM   payment
WHERE  EXTRACT(YEAR FROM payment_date) = 2007;

我假设您的字段 payment_date 是日期、时间或时间戳类型。

尝试在使用 like 运算符之前将 date/time 转换为字符串。

https://www.postgresql.org/docs/13/functions-formatting.html