2013-02-20 46 views
0

我不确定它是否可能,但是我可以使用set vars来避免在以下查询上重复日期范围吗?那么我只会声明TY和LY一次并在查询中重用?在日期范围之间的mysql变量避免重复

// ThisYear -- '2013-02-04 00:00:00' AND '2013-02-10 23:59:59' 
// LastYear -- '2012-02-06 00:00:00' AND '2013-02-12 23:59:59' 

SELECT 
    count(*) as total_num_bookings, 

    SUM(if(book_date BETWEEN '2013-02-04 00:00:00' AND '2013-02-10 23:59:59', 1, 0)) AS num_bookings_ty, 
    SUM(if(book_date BETWEEN '2012-02-06 00:00:00' AND '2012-02-12 23:59:59', 1, 0)) AS num_bookings_ly, 
    sj.pu_country 

FROM 
    pc_tech.sales_journal_default sj 

WHERE (book_date BETWEEN '2013-02-04 00:00:00' AND '2013-02-10 23:59:59') OR (book_date BETWEEN '2012-02-06 00:00:00' AND '2012-02-12 23:59:59') 
group by pu_country 
order by total_num_bookings DESC 
LIMIT 25; 

回答

1

是:

SET @ThisYear1='2013-02-04 00:00:00', @ThisYear2='2013-02-10 23:59:59' 
SET @LastYear1='2012-02-06 00:00:00', @LastYear2='2013-02-12 23:59:59' 

SELECT 
    count(*) as total_num_bookings, 

    SUM(if(book_date BETWEEN @ThisYear1 AND @ThisYear2, 1, 0)) AS num_bookings_ty, 
... 

编辑

或者使用准备好的语句:

SET @ThisYear="'2013-02-04 00:00:00' AND '2013-02-10 23:59:59'"; 
SET @LastYear="'2012-02-06 00:00:00' AND '2013-02-12 23:59:59'"; 

SET @sql = CONCAT("SELECT count(*) as total_num_bookings, SUM(if(book_date BETWEEN ", @ThisYear, ", 1, 0)) AS num_bookings_ty, ..."); 
PREPARE stmt from @sql; 
EXECUTE stmt; 
... 
DEALLOCATE PREPARE stmt; 
+0

它必须是4个变量?今年是两年还是去年? – 2013-02-20 16:42:34

+0

@Robbo_UK - 你可以用准备好的语句来完成,如果那样的话。看到我更新的答案。 – Raad 2013-02-20 17:11:15