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
我想获取以“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