You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:18:03