获取日期范围之间每一行的最小和最大日期时间

Posted

技术标签:

【中文标题】获取日期范围之间每一行的最小和最大日期时间【英文标题】:Get minimum and maximum datetime for each row between a date range 【发布时间】:2016-07-23 15:56:33 【问题描述】:

我正在为此苦苦挣扎!我的数据如下表所示,但会有多个用户。请注意,这不仅仅是开始/结束时间,其间还有许多日期。

+-------------------------+--------+---------------------------+
| Date                    | Name 2 | Access                    |
+-------------------------+--------+---------------------------+
| 2014-09-29 14:50:03.000 | User1  | Ground Floor Door 1 (In)  |
+-------------------------+--------+---------------------------+
| 2014-09-30 08:42:33.000 | User1  | Ground Floor Door 2 (In)  |
+-------------------------+--------+---------------------------+
| 2014-09-30 08:42:58.000 | User1  | 1st Floor Door 1 (In)     |
+-------------------------+--------+---------------------------+
| 2014-09-30 12:31:54.000 | User1  | Ground Floor Door 1 (Out) |
+-------------------------+--------+---------------------------+
| 2014-09-30 13:05:43.000 | User1  | Ground Floor Door 1 (In)  |
+-------------------------+--------+---------------------------+
| 2014-09-30 13:11:32.000 | User1  | Ground Floor Door 3 (Out) |
+-------------------------+--------+---------------------------+
| 2014-09-30 13:55:28.000 | User1  | Ground Floor Door 1 (In)  |
+-------------------------+--------+---------------------------+
| 2014-09-30 13:55:36.000 | User1  | Ground Floor Door 2 (In)  |
+-------------------------+--------+---------------------------+
| 2014-09-01 18:31:21.000 | User1  | Ground Floor Door 4 (Out) |
+-------------------------+--------+---------------------------+
| 2014-10-01 08:31:21.000 | User1  | Ground Floor Door 1 (In)  |
+-------------------------+--------+---------------------------+
| 2014-10-01 08:31:41.000 | User1  | Ground Floor Door 2 (In)  |
+-------------------------+--------+---------------------------+
| 2014-10-01 17:31:49.000 | User1  | Ground Floor Door 4 (Out) |
+-------------------------+--------+---------------------------+
| 2014-10-02 08:31:51.000 | User1  | Ground Floor Door 1 (In)  |
+-------------------------+--------+---------------------------+
| 2014-10-02 18:41:49.000 | User1  | Ground Floor Door 3 (Out) |
+-------------------------+--------+---------------------------+

我需要获取一系列日期之间每一天的最小值和最大值。如果我能计算出午餐时间有多长(中午 12 点到下午 2 点之间的第一次和最后一次滑动之间的差异),那也很好,但在我开始第一部分工作之前并不重要。

到目前为止,我已经尝试了以下查询的各种版本,但没有任何乐趣。任何人都可以帮助我吗?我可以毫无问题地获取特定日期的最小值和最大值,只有当涉及到一个范围时它才会起作用。

select min(Date) as EntryTime, max(Date) as ExitTime
from table
where [Name 2] like '%User1%' and EventTime between '2014-09-30 12:00:00' and '2014-10-05 12:00:00'
group by cast(Date as datetime)

这并没有给出所需的结果集。我希望我的查询为我的表返回类似的内容:

+-------------------------+-------------------------+----------+------------+
| EntryTime               | ExitTime                | Username | Date       |
+-------------------------+-------------------------+----------+------------+
| 2014-09-30 08:42:33.000 | 2014-09-01 18:31:21.000 | User1    | 2014-09-01 |
+-------------------------+-------------------------+----------+------------+
| 2014-10-01 08:31:21.000 | 2014-10-01 17:31:49.000 | User1    | 2014-10-01 |
+-------------------------+-------------------------+----------+------------+
| 2014-10-02 08:31:51.000 | 2014-10-02 18:41:49.000 | User1    | 2014-10-02 |
+-------------------------+-------------------------+----------+------------+

【问题讨论】:

这个查询的输出是什么,有什么问题? 我的查询为最小/最大列的每一行提供了两次相同的日期 您的查询中的属性与您的示例数据不匹配。 【参考方案1】:

我认为问题出在你的演员身上,试试CAST AS DATE

select name_2,
       min(`date`) as EntryTime,
       max(`date`) as ExitTime,
       cast(`date` As Date) as YourDate
  from table
where UserName like '%User1%'
   and EventTime between '2014-09-30 12:00:00' and '2014-10-05 12:00:00'
 group by cast(`date` As Date), name_2

【讨论】:

由于某种原因,我无法在此数据库中转换为日期。 “类型日期不是定义的系统类型。”我使用 CONVERT(varchar(11),Event) 解决了它,并且您的查询有效!谢谢【参考方案2】:

这将为您提供一个用户列表,每个用户都有每天的最小值和最大值

select cast(Date as datetime) as Date,Name,min(Date) as EntryTime, max(Date) as ExitTime
from table
where Date between '2014-09-30 12:00:00' and '2014-10-05 12:00:00'
group by cast(Date as datetime),Name

您可能需要将日期字段转换为日期类型

【讨论】:

它甚至没有接近,他想要每天的最小值和最大值,而不是每个名字。 这不起作用,因为它只返回第一个日期 (2014-09-30) 的最小值和最后一个日期 (2014-10-05) 的最大值。它需要在数据库中有条目的每一天获得最小值和最大值 @sagi - 也不远 现在就像我的回答一样,你甚至复制了列名,你是认真的吗? @sagi - 看看 - 它甚至还没有接近 ;)【参考方案3】:

试试这个,看看你会得到什么

SELECT MIN([Date]) AS 'EntryTime', MAX([日期])作为“退出时间”, 姓名 从测试 WHERE CAST([Date] AS DATE) 在 cast(getdate()-2 as date) 和 cast(getdate() as date) 之间 AND NAME ='用户 1' GROUP BY CAST([Date] AS DATE), NAME

在我自己的桌子上测试它可以正常工作。 enter image description here

【讨论】:

以上是关于获取日期范围之间每一行的最小和最大日期时间的主要内容,如果未能解决你的问题,请参考以下文章

在一个范围内选择最大和最小日期时间

如何在我的输入的每一行中获取最早日期和最早日期之间的天数

删除/隐藏 UIDatePicker 最小/最大日期范围之外的行?

获取csv中每个日期的最小和最大日期时间

从熊猫数据框中获取最小和最大日期

UIDatePicker,根据今天的日期设置最大和最小日期