[英]Ignoring the year in SQL Query with date range
通常,如果我想按日期范围对表格进行查询,我会这样做:
SELECT DISTINCT c.ID AS 'id' FROM CUST c
JOIN TICKET t ON s.ID = t.SALE_ID
WHERE c.ACTIVE_IND = 1
AND t.DELIV_DATE BETWEEN '01-01-2012' AND '01-02-2012'
ORDER BY t.DELIV_DATE DESC
现在我需要做同样的查询但忽略年份,所以我可以说从2月28日到3月2日和年份无所谓。
我尝试修改查询:
SELECT DISTINCT c.ID AS 'id' FROM CUST c
JOIN TICKET t ON s.ID = t.SALE_ID
WHERE c.ACTIVE_IND = 1
AND MONTH(t.DELIV_DATE) BETWEEN ... AND ...
AND DAY(t.DELIV_DATE) ... BETWEEN ...
ORDER BY t.DELIV_DATE DESC
如果起始DAY小于结尾,则上述查询工作正常。 这意味着如果我从2月20日到2月28日,我们可以正常工作,但是如果我去2月28日到3月2日它将不起作用。
任何解决方案,我可以在一个查询中实现这一点?
...
AND DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201'
...
更新 - 处理循环结束年份的范围(用表示from
和to
实际变量替换0101
和0201
):
...
AND
(DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201'
OR '0101' > '0201' AND
(DATE_FORMAT(t.DELIV_DATE, '%m%d') >= '0101' OR
DATE_FORMAT(t.DELIV_DATE, '%m%d') <= '0201'
)
)
...
if ($dates[0] != '0000-00-00') {
if(str_replace('-','',substr($dates[0],4))<=str_replace('-','',substr($dates[1],4))){
$having[] = ' DATE_FORMAT(`birthday`, "%m%d") BETWEEN ? AND ?';
}else{
$having[] = ' DATE_FORMAT(`birthday`, "%m%d") >= ? OR
DATE_FORMAT(`birthday`, "%m%d") <= ?';
}
$params[] = str_replace('-','',substr($dates[0],4));
$params[] = str_replace('-','',substr($dates[1],4));
}
包括日期相同的例子
让我们说2月28日到5月2日更复杂:
.... AND ((month(DELIV_DATE)=2 and day(DELIV_DATE)>=28) or (month(DELIV_DATE) between 3 and 4) or (month(DELIV_DATE)=5 and day(DELIV_DATE)<=2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.