DATE在动态之间

时间:2015-06-26 09:12:22

标签: 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) 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')

但是每年我都要审查这个改变年份的请求。我想让它变得动态,因为在我们的架构中手动更改它只是疯了。

最重要的是:

假设我们是15 June 2015。我想要一个涵盖期间的条款:

  

2015-01-01至2015-05-31

在有限的情况下,我需要在当年的第一天和上个月的最后一天之间。

修改

当我们在Januray时,我们必须在完整的一年工作,而不是当月。 (1月将在下个月处理)

3 个答案:

答案 0 :(得分:3)

您可以使用DATE_FORMAT功能构建一年中的第一天,并使用LAST_DAY来获取上个月的最后一天。

po.dateInvoice between DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-01-01') AND LAST_DAY(NOW() - INTERVAL 1 MONTH)

答案 1 :(得分:2)

您可以使用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日year和having子句将失败,因此可能需要一个额外的条件,而在最后一天作为

case 
  when month(curdate()) = 1 then concat(year(curdate()),'-01-31') 
  else last_day(curdate()-interval 1 month) 
end

因此,当您在1月份时,它将从1月1日到31日获得记录

更新:

  

当我们在Januray时,我们必须在完整的一年工作,而不是   本月。 (1月将在下个月处理)

逻辑可以用作

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
)

答案 2 :(得分:1)

我认为这些SQL对您有帮助。

 $.each(data, function (a, b){
         $('input[name="new_title"]').val(b.title);
         $('input[name="new_price"]').val(b.price);
  $('select[name="new_price_update"]').val(b.price_update);
    });

谢谢。