在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mysql语句向表中插入数据

如何在 mySQL 的 SELECT 语句中使用 If 语句和关系运算符? [复制]

我应该如何在 MySQL 中使用 NOT IN 语句

在 MySql 更新语句中使用函数

在 MySQL 语句中使用 datediff

MYSQL - 在 INSERT 语句中使用函数