我需要构建一个执行以下操作的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月将在下个月处理)
答案 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);
});
谢谢。