問:我想利用SQL找出在任意一月中的周日的數量。請幫幫我。
答:以下是一個簡單的技巧:
確定一個具體的月份,確定這個月的第一天
使用INTEGERS表生成一系列這個月第一天之後的日期覆蓋這個月所有的日期
用日期函數確定這一生成日期是否就是周日
用count()獲取周日的測試結果
為了創建integers表,用到下列命令:
createtableintegers
(iintegernotnullprimarykey);
insertintointegers(i)values(0);
insertintointegers(i)values(1);
insertintointegers(i)values(2);
insertintointegers(i)values(3);
insertintointegers(i)values(4);
insertintointegers(i)values(5);
insertintointegers(i)values(6);
insertintointegers(i)values(7);
insertintointegers(i)values(8);
insertintointegers(i)values(9);
現在我們假設你要測試的是2006年9月份,所以你確定的日期就是2006-09-01,然後用下面的查詢生成這個月所有的日期。注意:每個數據庫系統都會有不同的日期函數,所以一定要知道怎麼使用你的數據庫系統。這個例子就用到了MySQL語法。
set@day1=’2006-09-01’;
selectdate_add(@day1
,interval10*tens.i+units.iday)
asadate
fromintegersastens
cross
joinintegersasunits
wheredate_add(@day1
,interval10*tens.i+units.iday)
<date_add(@day1
,interval1month)
order
byadate
你會發現這裡有一個ORDER BY子句,所以你可以充分相信該查詢正確生成了這個月所有的日期。現在只需要將函數相加確定一個周六,並且計算的日期。現在只需要將函數相加確定一個周六,並進行計算:
set@day1=’2006-09-01’;
selectcount(
casewhendayofweek(
date_add(@day1
,interval10*tens.i+units.iday)
)=1
then1elsenullend) assundays
fromintegersastens
cross
joinintegersasunits
wheredate_add(@day1
,interval10*tens.i+units.iday)
<date_add(@day1
,interval1month)
Result:
sundays
4
非常簡單,不是嗎?