我有以下代码,我试图找到五月的记录,并试图按网站分组。但是得到这个错误。知道为什么它说没有匹配的函数吗?
SELECT
ad.site, SUM(e.clicks) AS totalclicks
FROM Extable e
INNER JOIN Ads ad ON e.ad_id = ad.ad_id
WHERE month(ad.Create_Time) = 5
Group by ad.site;但是我得到了这个错误
ERROR: function month(date) does not exist
LINE 4: WHERE month(ad.Create_Time) = 5
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 107发布于 2021-06-01 10:46:35
Here是PostgreSQL的日期/时间函数的文档。似乎你必须使用EXTRACT()或DATE_PART()
date_part('hour', timestamp '2001-02-16 20:38:40')
extract(hour from timestamp '2001-02-16 20:38:40')发布于 2021-06-01 13:32:54
没有内置的命名month。
您应该像这样编写您的查询:
SELECT
ad.site, SUM(e.clicks) AS totalclicks
FROM Extable e
INNER JOIN Ads ad ON e.ad_id = ad.ad_id
WHERE
extract (month from ad.Create_Time) = 5 --your month
and
extract (month from ad.Create_Time) = 2021 --year
Group by ad.site;除了月份之外,您还可以检查年份(根据您的要求)
发布于 2021-06-01 16:26:46
使用EXTRACT()效果很好,很多数据库都支持它,包括MySQL。
但是您也可以在PostgreSQL中创建一个MONTH()-function来模仿PostgreSQL中的这个MySQL函数。您需要3个函数,每个函数对应一种数据类型(日期、时间戳和带有时区的时间戳):
CREATE OR REPLACE FUNCTION month(IN i_date DATE)
RETURNS INT
LANGUAGE sql
IMMUTABLE
AS
$$
SELECT EXTRACT(MONTH FROM $1);
$$;
CREATE OR REPLACE FUNCTION month(IN i_timestamp TIMESTAMP)
RETURNS INT
LANGUAGE sql
IMMUTABLE
AS
$$
SELECT EXTRACT(MONTH FROM $1);
$$;
CREATE OR REPLACE FUNCTION month(IN i_timestamptz TIMESTAMP WITH TIME ZONE)
RETURNS INT
LANGUAGE sql
IMMUTABLE
AS
$$
SELECT EXTRACT(MONTH FROM $1);
$$;
-- Tests:
SELECT month(CURRENT_DATE); -- date
SELECT month(localtimestamp); -- timestamp
SELECT month(CURRENT_TIMESTAMP); -- timestamp with time zonehttps://stackoverflow.com/questions/67782083
复制相似问题