2011-06-14 129 views
1

我需要按用戶定義的時間段(可能是分鐘或小時的任何整數)查詢表和組記錄。我們要做的一個假設是,任何選擇的時間段都是從上午12:00開始的(如果這有任何意義的話)。換句話說,如果用戶選擇將記錄分組15分鐘,我們將不允許他們說,從12:07開始每15分鐘開始分組。我們會自動假設/使用12:00 AM作爲分組的起點。任何其他時間段也一樣。按n分鐘或小時分組

我是否需要爲此創建自己的功能?我並不過分關注性能,因爲我將使用其他方法/限制來盡力避免性能問題。

我的表看起來像這樣:

timeentry 
--entryid   (autonumber) 
--begindatetime (datetime) 
--enddatetime  (datetime) 

如果我使用一個功能,我不認爲這個問題,但我不打算立足於begindatetime我的分組和enddatetime忽略。

我正在使用MS Access,但我希望我的解決方案與SQL Server和MySQL兼容(如果可能)。但是,我目前的主要關注點僅僅是MS Access。

+0

你看着DATEDIFF? – Fionnuala 2011-06-14 15:30:30

+0

您是否有1899年12月30日作爲所有begindatetime值的日期部分? – HansUp 2011-06-14 16:38:33

+0

HansUp,不,它們是實際的,當前的日期和時間值。 – HK1 2011-06-14 23:26:39

回答

1

前段時間我回答了一個類似的問題,好像在這裏會有所幫助。 Here's the answer

+0

它看起來像你的解決方案分爲15分鐘,這將是4秒的組。你表示這給出了15分鐘的分辨率。我誤解了什麼? – HK1 2011-06-14 14:56:45

+0

@ HK1它將分鐘值(60)除以15,給出4個可能的值。如果分鐘數是35,那麼35/15 = 2.所以它按15分鐘的時間間隔進行分組,計算出的數值等於0到3. – 2011-06-14 17:30:56

2

在我看來,Partition()函數在這裏很有用。

您的代碼將根據用戶對日期的選擇(我假設您想限制查詢以指定單個日期的時間值),時間單位和組間隔時間來創建SELECT語句。

這一個將2011年6月14日爲日期,分鐘爲時間單位,15分鐘爲間隔。

SELECT 
    Partition(elapsed,0,1440,15) AS time_block, 
    q.id, 
    q.begindatetime 
FROM 
    [SELECT 
     t.id, 
     t.begindatetime, 
     TimeValue(t.begindatetime) * 1440 AS elapsed 
    FROM tblHK1 AS t 
    WHERE 
     t.begindatetime>=#2011-06-14# 
     And t.begindatetime<#2011-06-15# 
    ]. AS q 
ORDER BY q.begindatetime; 

不知道你有多喜歡這個,但。以下是一些示例輸出:

time_block id begindatetime 
    60: 74 1 6/14/2011 1:06:05 AM 
555: 569 3 6/14/2011 9:15:00 AM 
1395:1409 4 6/14/2011 11:15:00 PM 

time_block列不是非常用戶友好的。

+1

+1我真的認爲史蒂夫在這裏有更好的答案,但+1只是爲了介紹我到Partition()函數。我實際上並沒有想到我會把它用在我頭上,但是在恰當的情況下它似乎是非常寶貴的。 – mwolfe02 2011-06-14 16:07:47

+0

@ mwolfe02對。似乎分區()往往被忽視。 – HansUp 2011-06-14 16:15:20

+0

+1用於計算出Partition()的實際用途。我自己也偏愛它,但從來沒有找到任何可以使用它的東西。 – 2011-06-15 22:41:46

0

我不太清楚你想要什麼,但這裏是一個想法:

SELECT DateDiff("n",CDate("00:00"),[BeginDateTime])\15 AS No15s, 
     (DateDiff("n",CDate("00:00"),[BeginDateTime])\15)*15 AS NoMins, 
     Count(Table1.BeginDateTime) AS [Count] 
FROM Table1 
GROUP BY DateDiff("n",CDate("00:00"),[BeginDateTime])\15, 
     (DateDiff("n",CDate("00:00"),[BeginDateTime])\15)*15;