2011-06-14 127 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;