2012-01-11 1 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. expires - DATETIME), или если LAST bill (b. date) был создан 1 месяц назад. Дело в том, что я не хочу создавать какие-либо счета, если купон еще не начался. И это возможно, потому что я создаю купоны, которые начнутся через 3 месяца. Итак, я думаю, что «Между-решение» здесь не подходит?

Я пытаюсь понять это правильно, но теперь я буду признателен за любую помощь.

Я был бы счастлив и благодарен, если бы кто-то мог мне помочь.

С наилучшими пожеланиями,

Alex

ответ

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

+0

Я думаю, вы не имели в виду MySQL? Потому что, как и в документах MySQL, допускается только два выражения. Поэтому я могу получить дни с 'DATEDIFF (CURDATE(), c.expires)', но не точно месяц с выходом из одного. Разве это невозможно преобразовать его в месяц в MySQL? – Vay

Смежные вопросы