我需要查詢從現(xiàn)在算起五天前的日期。按照商業(yè)習慣,這五天應該不包含星期六和星期天。
專家回答:
對于許多跟商業(yè)日期有關的情況,最好的解決方案是使用日歷表格。例如,使用辦公時間(2001年5月22日)查詢兩個日期之間的時間差。
我們知道在這個例子中,假日不會計算在內。很難明白為什么假日不被計算在內,但是周末卻會被計算在內。但是既然假日不被計算在內,我們就可以應用一個公式。要開發(fā)這個公式,讓我們首先探討一下所有的可能性。
如果今天是星期一,那么,往回數(shù),我們跳過星期天和星期六,星期五是一天前,星期四是兩天前,如此類推,那么“五天前”就是上個星期一。這里的“五天前”就意味著把周末排除出去,得出我們想要的日期,并不是真正字面意義上的五天前。我們可以從備忘錄上看到差別。
如果今天是星期二,那么,往回數(shù),星期一是一天前,跳過星期天和星期六,星期五是兩天前,星期四是三天前,如此類推,那么“五天前”就是上個星期二。
這個模式——“五天前”就是上一個星期的同一天(星期X)——可重復到星期三、星期四和星期五。
到了星期六,這個模式就不可用了。在星期六,五天前是星期一。在星期天,因為我們不計算星期六,五天前也是星期一。
把我們的討論發(fā)現(xiàn)總結成如下數(shù)據(jù):
要獲得“五天前”的日期,從今天減去的總天數(shù)(包括周末)顯示在右邊列中。
我們給一個星期里的每一天排上序號,星期天(Sunday)=1,星期一(Monday)=2,如此類推,到星期六(Saturday)=7。把這些日子的序號排列在需要減去的天數(shù)前,我們會得到如下數(shù)據(jù):
if today is | weekday | subtract |
Monday | 2 | 7 |
Tuesday | 3 | 7 |
Wednesday | 4 | 7 |
Thursday | 5 | 7 |
Friday | 6 | 7 |
Saturday | 7 | 5 |
Sunday | 1 | 6 |
公式如下:
subtract = 7 - 2*(weekday/7) + (weekday-2)/7
記住,這是要獲得“五天前”的日期而需要從今天減去的天數(shù)。在這個公式里,除法是整數(shù)除法(即下舍入)。請不要問我這個公式是怎么發(fā)現(xiàn)的,反正是試差法的成果。
我們要怎么把這個公式應用到SQL里呢?下面是一個運用MySQL句法的例子:
selectdistinct
以下為引用的內容:
cust.fname
,cust.lname
,cust.phone
fromordersaso
inner
joincustomersascust
oncust.id=orders.cust_id
whereo.date_ordered=
date_sub(current_date
,interval
7-2*floor(dayofweek(current_date)/7)
+floor((dayofweek(current_date)-2)/7)
day)
ando.date_shippedisnull
這個查詢可以獲得“五天前”下訂單而貨還沒有運到的客戶的聯(lián)系方式。
新聞熱點
疑難解答