代码之家  ›  专栏  ›  技术社区  ›  Etienne

在MySQL语句中使用datediff

  •  0
  • Etienne  · 技术社区  · 16 年前

    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
    

    我需要将硬编码日期“2006-05-05”替换为MAX(b134_recdate),如下所示:

    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子句或select列表中包含的子查询中,并且被聚合的列是外部引用。

    3 回复  |  直到 8 年前
        1
  •  7
  •   Binary Worrier    16 年前

    尝试

    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
    
        2
  •  0
  •   Sam    16 年前

    您是否尝试过移动此:

    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

        3
  •  0
  •   KM.    16 年前

    此代码适用于sql server

    我不确定整个表的最大值是否为:

    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