在两个时间戳之间创建一系列时间

时间:2015-01-21 02:06:57

标签: sql datetime ms-access

我尝试根据两个时间戳创建一系列时间。

2个例子

     STARTTIMESTAMP         ENDTIMESTAMP
-------------------  -------------------
22/09/2014 07:00:00  22/09/2014 15:30:00
22/09/2014 20:00:00  23/09/2014 04:00:00

这些是完成工作的开始和结束时间。 有与工作时间相关的生产率目标(即第二个例子比第一个例子更有效率,因为它发生在一天中比较安静的部分)。

我遇到的问题是我只能获得上面的时间戳(在一个名为tbl_Raw_Data的表中)。确定"生产力"我需要扩展它们以显示在一天中给定的30分钟间隔内使用了多少资源。

请记住,每一天都略有不同,我还需要保持“午夜过夜”#34;字段(即我需要知道" day"以及工作时间传播的30分钟间隔(否则我只能查看00:00和23:59之间的数字)。

我真正需要的是从星期一午夜到星期日23:30每30分钟间隔使用的平均资源(即我希望所有其他数据在工作时间范围内的每个间隔都有一列)。

我还需要了解其他领域,即;位置等......也用于确定生产率。每月原始数据中有大约20000条记录。

1 个答案:

答案 0 :(得分:1)

您可以使用“数字”表生成中间日期/时间值。您的“数字”表将包含一个列,其中包含从零到大于您需要为给定日期范围创建的半小时“桶”数的连续整数。因此,为了覆盖整整一个月,您的表必须包含至少31 * 48 = 1488的数字。我的[Numbers]表有10,000行

   i
----
   0
   1
   2
   3
...
9998
9999

所以它可以处理~208天的时间。

现在,对于名为[tbl_Raw_Data]

的输入表
ID  STARTTIMESTAMP       ENDTIMESTAMP       
--  -------------------  -------------------
 1  2014-09-22 07:05:00  2014-09-22 15:30:00
 2  2014-09-22 20:00:00  2014-09-23 04:00:00

我们可以在Access中创建一个名为[qryRawDataDateRange]的已保存查询,以确定当前原始数据集的开始和结束日期

SELECT 
    MIN(DateValue(STARTTIMESTAMP)) AS FirstDate,
    MAX(DateValue(ENDTIMESTAMP)) AS LastDate
FROM tbl_Raw_Data

给了我们

FirstDate   LastDate  
----------  ----------
2014-09-22  2014-09-23

我们可以使用该保存的查询作为下一个已保存查询[qryBucketValues]的输入,该查询为该日期范围创建所有30分钟“桶”值

SELECT
    DateAdd("n", i * 30, FirstDate) AS BucketStart
FROM Numbers, qryRawDataDateRange
WHERE DateAdd("n", i * 30, FirstDate) < DateAdd("d", 1, LastDate)

返回

BucketStart        
-------------------
2014-09-22 00:00:00
2014-09-22 00:30:00
2014-09-22 01:00:00
2014-09-22 01:30:00
2014-09-22 02:00:00
2014-09-22 02:30:00
...
2014-09-22 22:00:00
2014-09-22 22:30:00
2014-09-22 23:00:00
2014-09-22 23:30:00
2014-09-23 00:00:00
2014-09-23 00:30:00
2014-09-23 01:00:00
2014-09-23 01:30:00
2014-09-23 02:00:00
2014-09-23 02:30:00
...
2014-09-23 22:00:00
2014-09-23 22:30:00
2014-09-23 23:00:00
2014-09-23 23:30:00

现在我们需要一个查询来告诉我们原始数据中每个时间跨度的第一个“桶”。我们将该名称命名为[qryFirstBucket]

SELECT
    ID,
    MAX(BucketStart) AS FirstBucket,
    ENDTIMESTAMP
FROM
    tbl_Raw_Data, qryBucketValues
WHERE BucketStart <= STARTTIMESTAMP
GROUP BY ID, ENDTIMESTAMP

返回

ID  FirstBucket          ENDTIMESTAMP       
--  -------------------  -------------------
 1  2014-09-22 07:00:00  2014-09-22 15:30:00
 2  2014-09-22 20:00:00  2014-09-23 04:00:00

现在我们可以创建一个名为[qryBucketEntriesById]的查询,它为我们提供原始数据中每行(ID)的各个存储桶条目

SELECT
    ID,
    BucketStart
FROM qryFirstBucket, qryBucketValues
WHERE 
    BucketStart >= FirstBucket AND BucketStart < ENDTIMESTAMP

给了我们

ID  BucketStart        
--  -------------------
 1  2014-09-22 07:00:00
 1  2014-09-22 07:30:00
 1  2014-09-22 08:00:00
 1  2014-09-22 08:30:00
 1  2014-09-22 09:00:00
 1  2014-09-22 09:30:00
 1  2014-09-22 10:00:00
 1  2014-09-22 10:30:00
 1  2014-09-22 11:00:00
 1  2014-09-22 11:30:00
 1  2014-09-22 12:00:00
 1  2014-09-22 12:30:00
 1  2014-09-22 13:00:00
 1  2014-09-22 13:30:00
 1  2014-09-22 14:00:00
 1  2014-09-22 14:30:00
 1  2014-09-22 15:00:00
 2  2014-09-22 20:00:00
 2  2014-09-22 20:30:00
 2  2014-09-22 21:00:00
 2  2014-09-22 21:30:00
 2  2014-09-22 22:00:00
 2  2014-09-22 22:30:00
 2  2014-09-22 23:00:00
 2  2014-09-22 23:30:00
 2  2014-09-23 00:00:00
 2  2014-09-23 00:30:00
 2  2014-09-23 01:00:00
 2  2014-09-23 01:30:00
 2  2014-09-23 02:00:00
 2  2014-09-23 02:30:00
 2  2014-09-23 03:00:00
 2  2014-09-23 03:30:00

然后,我们可以将该查询加入[tbl_Raw_Data](在ID上),以便在必要时检索其余的原始数据列。