在 MySQL 语句中使用 datediff
Posted
技术标签:
【中文标题】在 MySQL 语句中使用 datediff【英文标题】:Using datediff in MySQL statement 【发布时间】:2009-03-27 13:46:00 【问题描述】:这是我使用 datediff 工作的 SQL 语句:
SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate
FROM B134HREC
WHERE datediff (dd, '2006-05-05', getdate()) > 90
GROUP BY b134_rmcid, b134_recdate
ORDER BY b134_recdate DESC, b134_rmcid
我需要像这样用 MAX(b134_recdate) 替换硬编码日期“2006-05-05”:
SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate
FROM B134HREC
where datediff (dd, MAX(b134_recdate), getdate()) > 90
GROUP BY b134_rmcid, b134_recdate
ORDER BY b134_recdate DESC, b134_rmcid
但我收到此错误消息:
聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。
知道如何修复我的 SQL 语句吗?
【问题讨论】:
【参考方案1】:试试
SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate
FROM B134HRE
where datediff (dd,
(select MAX(b134_recdate) from B134HRE)
, getdate()) > 90
GROUP BY b134_rmcid, b134_recdate
ORDER BY b134_recdate DESC, b134_rmcid
【讨论】:
这解决了错误消息所建议的“或选择列表” 就目前而言,查询不能利用可能在 b134_recdate 上的任何索引(最大值除外)。如果它是“where B134_rec_date > DateAdd(dd, getDate(), 90)”,它将使用一个索引,如果它存在的话。注意:不确定 dateadd 语法是否正确,但你明白了。【参考方案2】:你试过移动这个吗:
datediff (dd, MAX(b134_recdate), getdate()) > 90
到 HAVING 子句?
sql 语句是:
SELECT SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate
FROM B134HRE
GROUP BY b134_rmcid, b134_recdate
ORDER BY b134_recdate DESC, b134_rmcid
HAVING datediff (dd, MAX(b134_recdate), getdate()) > 90
【讨论】:
试过这个是的。有 datediff (dd, MAX(b134_recdate), getdate()) > 90 .........然后我收到错误消息“关键字'GROUP'附近的语法不正确” "where" 限制分组的行,"have" 限制返回的组。这不会完全一样 把recdate放在“有”意味着你不能按它分组。 有趣的是,它应该可以工作......那么整个声明怎么样?有最后一个子句吗?【参考方案3】:此代码用于 sql server
我不确定 MAX 是否适用于整个桌子:
DECLARE @MaxDate datetime
SELECT @MaxDate=MAX(b134_recdate) FROM B134HRE
/* if you don't want time you need to trim it from @maxDate*/
SELECT
SUM(b134_nettpay) AS Total, b134_rmcid, b134_recdate
FROM B134HRE
where datediff (dd, @MaxDate, getdate()) > 90
GROUP BY b134_rmcid, b134_recdate
ORDER BY b134_recdate DESC, b134_rmcid
或每组:
SELECT
SUM(b.b134_nettpay) AS Total, b.b134_rmcid, b.b134_recdate
FROM B134HRE b
INNER JOIN (SELECT
b134_rmcid, b134_recdate , MAX(b134_recdate) AS MaxDate
FROM B134HRE
GROUP BY b134_rmcid, b134_recdate
) dt ON b.b134_rmcid=dt.b134_rmcid AND b.b134_recdate=dt.b134_recdate
where datediff (dd, dt.MaxDate, getdate()) > 90
GROUP BY b.b134_rmcid, b.b134_recdate
ORDER BY b.b134_recdate DESC, b.b134_rmcid
但你可以试试这些
【讨论】:
以上是关于在 MySQL 语句中使用 datediff的主要内容,如果未能解决你的问题,请参考以下文章