问题描述
|
我需要按用户定义的时间段查询表和组记录,该时间段可以是分钟或小时的任意整数。我们要做出的一个假设是,任何选定的时间段都是从12:00 AM开始(如果有任何意义)。换句话说,如果用户选择按15分钟将记录分组,那么我们将不允许他们说,从15:07 AM开始每15分钟开始分组。我们将自动假设/使用12:00 AM作为分组的起点。其他任何时间段均相同。
我需要为此创建自己的功能吗?我并不太担心性能,因为我将使用其他方法/限制来尝试避免性能问题。
我的桌子看起来像这样:
timeentry
--entryid (autonumber)
--begindatetime (datetime)
--enddatetime (datetime)
如果我使用函数,我认为这并不重要,但是我确实计划将分组基于begindatetime并忽略enddatetime。
我正在使用MS Access,但希望我的解决方案与sql Server和MysqL兼容。但是,目前我主要关注的只是MS Access。
解决方法
在我看来,Partition()函数在这里可能很有用。
您的代码将根据用户对日期的选择(我假设您希望将查询限制为单个日期的begindatetime值),时间单位和组间隔来创建SELECT语句。
该日期是2011年6月14日,日期是分钟,时间单位是分钟,间隔是15分钟。
SELECT
Partition(elapsed,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列不是非常用户友好。
, 我不太确定您要什么,但这是一个主意:
SELECT DateDiff(\"n\",CDate(\"00:00\"),[BeginDateTime])\\15 AS No15s,(DateDiff(\"n\",[BeginDateTime])\\15)*15 AS NoMins,Count(Table1.BeginDateTime) AS [Count]
FROM Table1
GROUP BY DateDiff(\"n\",[BeginDateTime])\\15,[BeginDateTime])\\15)*15;