SQL如何将datetime类型close_date格式化为日期实现交易数据按日分组
问题根因
你触发语法错误的核心是c2.date(close_date)的写法不符合SQL语法规则:date()是数据库提供的系统转换函数,不是c2表的内置属性,要对c2表的close_date字段做日期转换,正确的写法是把字段放在函数参数里,即date(c2.close_date)。
修正后的可用查询(保留你原有子查询写法)
SELECT date(close_date) AS "Date", (SELECT COUNT(*) FROM trades WHERE close_profit > 0 AND date(c2.close_date) = date(close_date)) AS Wins, (SELECT COUNT(*) FROM trades WHERE close_profit < 0 AND date(c2.close_date) = date(close_date)) AS Losses, (SELECT AVG(close_profit * 100) FROM trades WHERE date(c2.close_date) = date(close_date)) AS "Avg", (SELECT SUM(close_profit_abs) FROM trades WHERE date(c2.close_date) = date(close_date)) AS "Profit" FROM trades c2 WHERE date(close_date) IS NOT NULL GROUP BY date(close_date)
更推荐的优化写法(性能更高,无需嵌套子查询)
你可以直接用条件聚合实现相同逻辑,只需要单次扫描交易表,数据量较大时性能远优于子查询方案:
SELECT date(close_date) AS "Date", COUNT(CASE WHEN close_profit > 0 THEN 1 END) AS Wins, COUNT(CASE WHEN close_profit < 0 THEN 1 END) AS Losses, AVG(close_profit * 100) AS "Avg", SUM(close_profit_abs) AS "Profit" FROM trades WHERE close_date IS NOT NULL GROUP BY date(close_date)
提示:上述查询返回的
Date字段为标准日期类型,Grafana可以直接识别适配为时间维度,无需额外格式转换。
不同数据库的日期转换适配说明
如果你用的数据库不支持date()函数,可以替换为对应语法:
- PostgreSQL:替换
date(close_date)为close_date::date或date_trunc('day', close_date) - SQL Server:替换
date(close_date)为CAST(close_date AS DATE) - Oracle:替换
date(close_date)为TRUNC(close_date)
内容的提问来源于stack exchange,提问作者user3647376
相关产品推荐
相关产品推荐

