为什么MySQL SUM会在2021年辞职

为什么MySQL SUM会在2021年辞职,mysql,Mysql,该代码在2020年工作后于2021年停止工作: 按名称从daily_prod GROUP中选择name,SUMCASE WHEN YEARWEEKprod_date=YEARWEEKnow-间隔1周,然后选择gas_prod ELSE NULL结束为LastWeek 代码现在计算的数字比上周发生的要大。为什么新年会导致此代码以不同的方式工作?首先,在这里使用sum case/when是一个错误的选择。您的查询针对的是整个daily_prod表、每条记录,但仅在给定的yeardate期间内根据当前

该代码在2020年工作后于2021年停止工作:

按名称从daily_prod GROUP中选择name,SUMCASE WHEN YEARWEEKprod_date=YEARWEEKnow-间隔1周,然后选择gas_prod ELSE NULL结束为LastWeek


代码现在计算的数字比上周发生的要大。为什么新年会导致此代码以不同的方式工作?

首先,在这里使用sum case/when是一个错误的选择。您的查询针对的是整个daily_prod表、每条记录,但仅在给定的yeardate期间内根据当前日期进行求和。与其这样做,不如构建一个WHERE子句来获取您关心的记录。YearWeek功能基于星期日到星期六的日程安排。例如,本周从1月31日凌晨12:00到午夜12:00,但不包括2月7日凌晨12:00。这包括截至2月6日晚上11:59:59的一切

所以,通过使用嵌入的MySQL变量,您可以构建一个from表别名,如我将要展示的。首先,让我们获取当前的时间,包括小时/分钟/秒,然后只提取日期部分。例如:2021-02-04@01:42am截短至2021-02-04凌晨12:00am

select cast( now() as date )
从那以后,现在,我们需要转到本周的第一天,代表为星期天。为此,我们使用一周中的某一天减去1,因此它是一个基于零的值,其中周日=0,周六=6。所以星期四,通常返回5,减去1=4。2月4日-4天=1月31日,即本周的第一天

select date_sub( [result of sql above], interval dayofweek( [result of sql above] ) -1 day )
现在,由于您需要整个星期的数据,在这种情况下,您的数据将从1月31日上午12:00到2月6日星期六晚上11:59:59。因此,在本周开始前加上1周,即2月7日

select  date_add( [result of 2nd query], interval 1 week )
是的,这是有意的,因为现在在您的最终查询中,您可以在2月7日之前查询

因此,通过在数据源上使用where,您只能获取这些记录,并且,如果您的表具有关于事务日期的索引,则可以针对查询进行优化。要使用内联变量,我们可以使用这些变量的结果作为查询的一部分,例如:

SELECT 
      dp.name, 
      SUM( dp.gas_prod ) CurrwntWeekGas 
   FROM 
      daily_prod dp,
      ( select
               -- first, variable @nd = Now as a date only
               @nd := cast( now() as date ),
               -- from the @nd, subtract 0-based day of week
               -- example: Thursday is 5th day of week -1 = 4 days to subtract
               @fow := date_sub( @nd, interval dayofweek( @nd ) -1 day ),
               -- finally from the first of the week, add 1 week to the END point for the query
               @nextWeek := date_add( @fow, interval 1 week )
      ) sqlvars
   where
         -- only grab records greater or equal to the first day of the week
          dp.prod_date >= @fow
      -- and ALSO LESS then the the beginning of NEXT week
      AND dp.prod_date < @nextWeek
   GROUP BY 
      dp.name
因此,在处理from子句别名sqlvars时,它会创建3个@variables来定义周初和下周初的值。然后可以将这些应用于where子句,并仅限制所需的记录,而不是整个表


如果你真的想从你所在的一周中得到上一周的结果。。。EX:从1月24日到1月30日,因为本周还没有完成,然后只需改变你的星期一到1,到星期一到8,得到整个前一周,而不是当前的一周,你现在在中间。显示一些示例数据以及该示例数据的预期和实际结果,以演示问题。我看你的查询没有任何问题。你是否尝试过选择名称、生产日期、年工作日、年工作日知道-从每日生产开始每隔一周查看是否有问题?@RobbyCornelissen YEARWEEK包括年份,因此这不应该是问题