Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在日期范围为的SQL查询中忽略年份_Mysql_Sql - Fatal编程技术网

Mysql 在日期范围为的SQL查询中忽略年份

Mysql 在日期范围为的SQL查询中忽略年份,mysql,sql,Mysql,Sql,通常,如果我想按日期范围对表进行查询,我会这样做: 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 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 
如果开始日期小于结束日期,则上述查询可以正常工作。这意味着,如果我从2月20日到2月28日,它可以正常工作,但如果我从2月28日到3月2日,它将不起作用

有什么解决方案可以在一个查询中实现吗

...
AND DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201'
...

更新-处理年底循环的范围(将
0101
0201
替换为表示
的实际变量):

。。。
及
(日期格式(t.deliver_DATE,%m%d'),介于“0101”和“0201”之间
或“0101”>“0201”和
(日期格式(t.Deliver_DATE,'%m%d')>='0101'或

日期格式(t.deliver_DATE,“%m%d”)假设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)
…和((月(交货日期)=2天(交货日期)>=28)或(月(交货日期)介于3和4之间)或(月(交货日期)=5天(交货日期)
如果($dates[0]!='0000-00-00'){

如果(str_replace('-','',substr($dates[0],4]),您应该使用DAYOFYEAR和MAKEDATE,并将它们设置为同一年。在MAKEDATE(1971,DAYOFYEAR(t.deliver_DATE))和MAKEDATE(1971,DAYOFYEAR('01-01-2012')之间使用be MakeDayOfYear(1971,DAYOFYEAR(t.deliver_DATE))表示谢谢你对Sergey的评论。看起来不错,但deathApril的解决方案似乎简单而不那么复杂。不过我应该对它进行更多的测试。很好,很简单,我喜欢。@SergeyBenner MySQL有日期格式我不知道问题的
01-02-2012
是1月2日还是2月1日-在我的回答中,显然是Ferbruary 1st;))如果期望的日期范围循环年呢?如果它应该独立于年,它如何循环年呢?!这总是正确的then@SergeyBenner:deathApril的回答中有
'%m%d'
。您有
'%d%m'
我认为OP正在寻找更通用的内容。如果日期范围循环为年,这也不起作用。th谢谢你的时间,但老实说,我不明白你的解决方案背后的逻辑:D
.... 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)
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));                                                        
                    }