2011-05-29 198 views
3

我希望將它的時間戳記字段上的記錄按兩週分組。我現在每週都這樣做,但我希望它也是兩週一次。我怎麼做 ?有沒有特定的方法來做到這一點,比如我們如何使用WEEK('timestamp','%d-%m-%Y')函數來分組?每兩週分組一次mysql記錄

在下面的圖片中,你可以看到日期21和14來兩週10.任何建議?

+0

我給你的問題upvote,因爲添加關於想要兩個星期的最後日期的皺紋使它十倍更難,這很有趣。因爲你使用了「四周」這個詞。通常情況下,你會編輯你的問題,使得諸如此類的細節成爲問題的一部分,而不是在評論中提問並在問題中提出含糊不清的問題。 (截至修訂2,該問題的這一部分沒有清楚地傳達你想要的而不是你所得到的。) – 2011-05-29 06:47:26

回答

5

由2拍攝結果從week()和除法,轉換爲整數(向上或向下)。由於今年的第一週爲1周(取決於模式week()使用),你可能希望同時第1周和2周,成爲兩週1,使周0變爲兩週0,我們將使用ceil()

select sum(amount) as amountSum, ceil(week(myTimestamp)/2) as fortnight 
    from myTable 
    group by fortnight 
    order by fortnight; 

參考:week() and its modes

編輯:在獲得兩週的最後一天...

沒有內置函數來得到一個週數的任何日期。多麼有趣。

由於您在兩週進行了聚合和分組(因此結果行可能會在幾十個),我通常首先考慮在客戶端代碼中計算這些填充值以消耗結果,但事實證明它實際上是由於訪問原始時間戳,在數據庫中更容易執行此操作,儘管這很難看。

您所要做的只是從原始時間戳中計算一週的結束時間,但如果是從第一週開始計算,則還必須再增加7天,以便從第二週的第二週每兩週。 (基於this article。)我還增加了一年,以防萬一。並且還假定星期日是一週中的第一天(但請仔細檢查您的MySQL實例的default_week_formatweek()的表以進行仔細檢查)。

select sum(amount) as amountSum, year(myTimestamp) as yr, ceil(week(myTimestamp)/2) as fortnight, 
    date_add(myTimestamp, interval (7 - dayofweek(myTimestamp)) + ((week(mytimestamp) % 2) * 7) day) as endoffortnight 
    from myTable 
    group by yr, fortnight 
    order by yr, fortnight; 

我希望那個作品或者距離不夠近。我沒有用很多數據對它進行測試。

+0

它會將列分組嗎?我需要在數量列上使用聚合函數,同時對時間戳列進行分組。這會工作嗎? – Deepak 2011-05-29 05:12:43

+0

是的,你只需按兩週的計算進行分組。給它一個別名幫助。我編輯了我的答案以擴展示例sql。 – 2011-05-29 05:25:01

+0

在這個我想顯示正常的日期還有兩週的數字..就像兩週的結束日期。現在我得到兩個不同的日期一兩週..有沒有辦法解決達特問題? – Deepak 2011-05-29 05:28:49

0

從任意起始日期測量的天數,然後由14以下劃分爲紅移PSQL實現:

SELECT COUNT(1) 
    ,DATEDIFF('day', '5-28-2012', hour)/14 as fortnight, 
    ,DATEADD('day', 14 * (DATEDIFF('day', '5-28-2012', hour)/14), '5-28-2012') as start_of_fortnight 
GROUP BY 1 
ORDER BY 1 

一週()函數可以得到相當複雜 - 我躲開它。

1
SELECT CEILING(DATEPART(wk,Timestamp)/2.0) AS 'Fortnight' 
FROM mytable 
GROUP BY CEILING(DATEPART(wk,Timestamp)/2.0) 
ORDER BY CEILING(DATEPART(wk,DateKey)/2.0); 

使用DATEPART功能,wk給出了一年的週數。當我們GROUP BY DATEPART(wk,Timestamp)/2,我們正在每兩週一組。可以使用CEILING()ROUND()

FYI DATEPART(WK,時間戳)/ 2的範圍是從0到26因此
DATEPART(DATEPART(WK,時間戳)/ 2)的範圍是從0到26 但 CEILING(DATEPART(WK,時間戳)/2。0)的範圍是1到27