2012-07-27 28 views
0

我們使用MySQL作爲我們的數據庫來存儲具有時間戳的消息。是否可以創建一個返回最近n個工作日消息的查詢?最後n個工作日在sql中,其中clausel

I.e.如果n是4,今天是星期二,我希望從本週一,週五上週,週四上週和週三上週幾周發出消息。

回答

2

行。作爲Vatev建議您應該計算日期星日期提前,但如果你真的想這樣做,你可能需要以下功能:

˚F所有你需要的應該算你應該有多少個星期回去的IRST,很簡單...對於你one week = 5 days,這意味着

weeks = FLOOR(days/5) 

我們已經採取了幾個星期的照顧,所以我們現在必須一起工作休息:

rest = days MOD 5 

現在我們有兩種情況,週末已經發生或沒有,因爲這有沒有的情況下週末都不錯。我們必須添加2天才能跳過它。週末發生,如果(WEEKDAY(now) - rest) < 0

rest = IF((WEEKDAY(now) - rest) < 0, rest + 2, rest) 

而現在我們可以把它建立一個標準桿(讓我們假設你有{days}{rest}預先計算):

WHERE date >= ADD_DATE(
    ADD_DATE (
     {now}, 
     INTERVAL -IF((WEEKDAY({now}) - {rest}) < 0, {rest} + 2, {rest}) DAYS, 
    ), 
    INTERVAL -FLOOR({days}/5) WEEKS 
) 
+0

感謝您的詳細解釋。正如Vatev指出的那樣,我想我會在我的應用程序中計算開始日期,以便從db中施加一些壓力。 – Thomas 2012-07-27 18:10:54

+1

從這個操作對數據庫的壓力可以忽略不計,但如果你用一種更加健全的語言來做,它可能會減少很多壓力:P – Vatev 2012-07-27 18:20:04

+0

@Thomas我寫了它,所以我可以重用任何其他語言特別是PHP接受(在['strtotime'](http://php.net/manual/en/function.strtotime.php))間隔和邏輯是相同的。你甚至可以做'timestamp() - 星期* 7天* 24小時* 3600秒'來節省一些小資源。 – Vyktor 2012-07-27 18:26:36

0

你有沒有試過類似的東西?

SELECT columns 
FROM table 
WHERE datediff(column_with_timestamp,NOW()) > n 

其中,N的定義與上面定義的一樣,爲您尋找的天數。

+0

工作日,不包括週末。 – Vyktor 2012-07-27 17:20:20

1

我能想出的計算起始日期(查詢{START_DATE})在您所選擇的語言,然後運行這樣最好:

SELECT some_things 
FROM your_table 
WHERE 
    WEEKDAY(time_column) < 5 
    AND time_column >= {start_date} 
ORDER BY time_column DESC 

你也可以做一個存儲函數計算'x日前的日期'並將其用於{start_date}。

+0

非常好的建議,謝謝。 – Thomas 2012-07-27 18:09:13

0
COL >= date_sub(NOW(), interval 1 week) and 
weekday(COL) < 5 
  • DATE_SUB是如果您想直接與MySQL這將是一個有點複雜,這樣做是爲了尋求上週創建
  • 平日是排除週日或週六