【问题标题】:Using datediff in MySQL statement在 MySQL 语句中使用 datediff
【发布时间】: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 语句吗?

【问题讨论】:

    标签: sql mysql sql-server datediff


    【解决方案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
    

    但你可以试试这些

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多