Mysql 日期处于动态之间

Mysql 日期处于动态之间,mysql,date,dynamic,Mysql,Date,Dynamic,我需要构建一个SQL查询,它执行以下操作 SELECT pi.desc, pa.nameAddress, pi.ref, pi.descItem, pi.quantity, pi.totalDF, pi.code, pi.codeBL, cl.dateShip, po.dtValidated, po.supervisorDate, DATEDIFF(po.supervisorDate, po.dtValidated

我需要构建一个SQL查询,它执行以下操作

SELECT  pi.desc,
    pa.nameAddress,
    pi.ref,
    pi.descItem,
    pi.quantity,
    pi.totalDF,
    pi.code,
    pi.codeBL,
    cl.dateShip,    po.dtValidated,     po.supervisorDate,  DATEDIFF(po.supervisorDate, po.dtValidated) AS 'diffValidSupervisor',   DATEDIFF(cl.dtlivr, po.supervisorDate) AS 'diffExpeValid',  year(cl.dtlivr),    month(cl.dtlivr) FROM
    new.proforma_item pi
        INNER JOIN
    old.cdestk_lig cl ON pi.codeCde = cl.codcde INNER JOIN new.proforma po ON po.idProforma = pi.idProforma Inner JOIN new.proforma_address pa ON po.idProforma = pa.idProforma GROUP BY pi.desc, pi.ref, pi.descItem, pi.code, pi.codeBL, cl.dateShip, po.dtValidated, po.supervisorDate, month(cl.dateShip), po.dateInvoice HAVING (po.dateInvoice between '2014-01-01' AND '2014-12-31')
但每年我都要审查这一请求以改变年份。我想使其动态化,因为在我们的体系结构中,手动更改是非常疯狂的

最好的是:

假设我们是2015年6月15日的。我想要一个包含以下期限的中间条款:

2015-01-01至2015-05-31

在有限时间内,我需要一个从今年的第一天到上个月的最后一天的时间间隔

编辑


当我们在Januray的时候,我们必须在过去的一年里工作,而不是现在这个月。(一月将在下个月治疗)

我想这些SQL对你有帮助

SELECT  pi.desc,
    pa.nameAddress,
    pi.ref,
    pi.descItem,
    pi.quantity,
    pi.totalDF,
    pi.code,
    pi.codeBL,
    cl.dateShip,    po.dtValidated,     po.supervisorDate,  DATEDIFF(po.supervisorDate, po.dtValidated) AS 'diffValidSupervisor',   
    DATEDIFF(cl.dtlivr, po.supervisorDate) AS 'diffExpeValid',  year(cl.dtlivr),    month(cl.dtlivr) FROM
    new.proforma_item pi
        INNER JOIN
    old.cdestk_lig cl ON pi.codeCde = cl.codcde INNER JOIN new.proforma po ON po.idProforma = pi.idProforma 
    Inner JOIN new.proforma_address pa ON po.idProforma = pa.idProforma GROUP BY pi.desc, pi.ref, pi.descItem, pi.code, pi.codeBL, cl.dateShip, 
    po.dtValidated, po.supervisorDate, month(cl.dateShip), po.dateInvoice 
    HAVING (po.dateInvoice between CONCAT(YEAR(CURDATE()),'-01-01') AND   last_day(curdate()-interval 1 month))

谢谢。

您可以使用concat功能轻松获取当年的第一天,获取上个月的最后一天也很简单

mysql> select 
concat(year(curdate()),'-01-01') as fday, 
last_day(curdate()-interval 1 month) as lday ;
+------------+------------+
| fday       | lday       |
+------------+------------+
| 2015-01-01 | 2015-05-31 |
+------------+------------+
1 row in set (0.00 sec)
因此,在where子句中,您只需要将硬编码部分替换为上述日期范围

HAVING 
(
  po.dateInvoice between 
  concat(year(curdate()),'-01-01') AND 
  last_day(curdate()-interval 1 month)
)
上述方法可行,但仍然可能存在一个逻辑问题,如果我们现在是1月,那么按照逻辑,它将得到一年的第一天,然后是上个月的最后一天,以及上一年的12月31日,having子句将失败,因此在得到最后一天时可能需要额外的条件

case 
  when month(curdate()) = 1 then concat(year(curdate()),'-01-31') 
  else last_day(curdate()-interval 1 month) 
end
所以当你在一月份的时候,它将从1月1日到31日创下记录

更新:

当我们在Januray时,我们必须在过去的一年里工作,而不是 当月。(一月将在下个月治疗)

这一逻辑可以应用为:

HAVING 
(
  po.dateInvoice between 
   case 
   when 
    month(curdate()) = 1 then concat(year(curdate())-1,'-01-01') else concat(year(curdate()),'-01-01')
   end
  AND
   case 
   when
    month(curdate()) = 1 then concat(year(curdate())-1,'-12-31') else  last_day(curdate()-interval 1 month)
   end
)
您可以使用该函数构造一年中的第一天,并获取上个月的最后一天

po.dateInvoice between DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-01-01') AND LAST_DAY(NOW() - INTERVAL 1 MONTH)
  • (显示2014年全年)

你为什么要在一年中增加1?感谢你抽出时间回答这个问题。但他不希望第二次约会总是
12-31
。这应该是前一个月的最后一天。@Barmar,这个答案可以帮助其他人使他们的查询变得动态,它不是回答我的第二部分,但它是一个很好的答案:)为什么要使用
date\u format()
last_day()
返回一个日期,您不需要再次解析它。它起作用了,但我仍然可能有一个逻辑问题。请参阅更新。@AbhikChakraborty哼,说得好,但如果我们是在一月份,我们必须在2014年全年而不是当月工作。(发票目的我们对过去一个月的账单)那么它将返回去年1月到12月底的数据吗?@AbhikChakraborty它是这样做的!考虑当前日期是一月二十二日,语句<代码> DATEY格式(2015-01-22)-间隔1个月,'%Y-01-01 ' < /代码>将产生“2014-01-01”。在第一天字段中执行
-间隔1个月
,这是关键,这使得整个
案例
不必要。@Hooli接受的答案不必要地复杂。请尝试一下这个解决方案。我已经对你的答案投了赞成票,但我会尝试一下你的答案well@Jasny-ArnoldDaniels我的错我没有注意到你的
日期格式
把戏,这比我的好<代码>+1