2012-01-11 66 views
0

我有以下查询:如何检查当前日期和其他日期是否超过1个月前?

$data = mysql_fetch_array(mysql_query("SELECT 
c.`id` AS cid, 
p.`id` AS pid,p.`email` 

FROM `coupons` AS c 
LEFT JOIN `coupons_partners` AS cp ON cp.`cid` = c.`id` 
LEFT JOIN `partners` AS p ON p.`id` = cp.`pid` 
LEFT JOIN `bills` AS b ON b.`pid` = p.`id` 

WHERE 
( 
    CURRENT_DATE() BETWEEN c.`expires` AND ADDDATE(c.`expires`, INTERVAL 1 MONTH) 
) 
OR 
( 
    CURRENT_DATE() NOT BETWEEN c.`expires` AND ADDDATE(c.`expires`, INTERVAL 1 MONTH) 
    AND 
    CURRENT_DATE() BETWEEN b.`date` AND ADDDATE(b.`date`, INTERVAL 1 MONTH) 
) 
ORDER BY b.`id` DESC"));  

它有点凌乱。我想做一个cronjob并自动创建账单。只有在优惠券到期1个月后才能创建(c。expiresDATETIME),或者如果最后一个帐单(b。date)是在1个月前创建的。 也是,如果优惠券尚未开始,我不想创建任何账单。这是可能的,因为我创建了可能会在3个月内开始的优惠券。所以我想“解决方案间”不适合这里?

我想弄明白它是否正确,但现在我会很感激任何帮助。

如果有人能帮助我,我会很高兴也很感激。

最好的问候,

亚历

回答

0

使用DATEDIFF

SELECT DATEDIFF(month, '2000-02-10','2000-01-10'); 

产量1,因为02-10为一个月01-10

一个月后可以更改为取而代之的天数。

参考:http://www.1keydata.com/sql/sql-datediff.html

UPDATE: 在MSQL你可以使用DATEDIFF,因为它可以一个月作为参数传递,MySQL的版本只返回天。在MySQL中,您可以改为使用PERIOD_DIFF虽然它不知道每个月的确切天数。

PERIOD_DIFF(P1,P2)

“返回时段P1和P2,P1和P2之间的月应在格式YYMM或YYYYMM的数量。注意周期参数P1和P2不是日期值。“

mysql> SELECT PERIOD_DIFF(200802,200703); 
     -> 11 

如果您需要知道究竟有多少个月不同,您需要进行多步计算。要找出一个月内的天数,您可以使用LAST_DAY函数,并从结果中提取日期部分并用作进一步计算的基础。

LAST_DAY('2003-02-05'); 
     -> '2003-02-28' 
+0

我想'DATEDIFF(月,CURRENT_DATE(),c.expires)',但他不喜欢'CURRENT_DATE()'。你知道我应该把这个日期放在那里吗? – Vay 2012-01-11 17:47:25

+0

我猜你不是指MySQL?因为就像在MySQL纪录片中一样,只允许两个表达式。所以我可以用'DATEDIFF(CURDATE(),c.expires)'得到这些日子,但不是一个月,输出为1。无论如何,这不是可能将其转换为MySQL月吗? – Vay 2012-01-11 21:45:30

相关问题