0

我正在尝试查询使用 id、startDateTime、endDateTime 设置的表。假设第 1 行如下所示:

id      startDateTime      endDateTime      
100     2/9/2012 20:55     3/21/2012 10:43

我需要查询上述内容,以便获得上述范围内所有天数的不同计数。我的预期结果将在上述 42 天,因为从 2 月 9 日到 3 月 21 日有 42 个独特的日历日。Datediff 因为它查看时间片给了我 41 天。我尝试了 datediff 和 timediff 的各种迭代,试图让它工作,但找不到在所有情况下都有效的东西。关于如何在 SQL 中完成此操作的任何建议?

我从如下所示的查询开始:

SELECT ConditionStatus.ID, 
  SUM((DATEDIFF(ConditionStatus.endDate,ConditionStatus.startDate))) AS Duration 
WHERE ID = 100

我的查询返回 41 的持续时间,这在技术上是准确的,但我需要设置条件以使日期范围内的每个日期都计数为 1

我试图模仿我们在数据仓库中使用的一些逻辑,在其中我们为每个有活动的日期持续计数 1。

谢谢,鲍勃

4

2 回答 2

3

基本答案是您可以使用DATEDIFF()并添加 1,因为您想包括当天。

例如:

mysql> select datediff(current_date(),current_date()) + 1;
+---------------------------------------------+
| datediff(current_date(),current_date()) + 1 |
+---------------------------------------------+
|                                           1 |
+---------------------------------------------+
1 row in set (0.00 sec)

扩展您的原始示例,您可以将字符串转换为日期时间,然后丢弃时间组件,然后使用如下查询计算包含日期计数:

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')),
    ->          DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')))) + 1 as days_in_range;
+---------------+
| days_in_range |
+---------------+
|            42 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')),
    ->          DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')))) + 1 as days_in_range;
+---------------+
| days_in_range |
+---------------+
|            42 |
+---------------+
1 row in set (0.00 sec)
于 2012-05-16T18:51:53.907 回答
0

请参阅此答案-如何选择日期范围内的不同天数?

在使用@Ike 的答案之前先看看。如果您添加 +1,则在时间值为 00:00:00 的情况下,您将获得太多。

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43')返回 41

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43') + 1返回 42

这就是中断的地方-

select datediff(days, '2/9/2012 20:55', '3/21/2012 00:00:00') + 1返回 42

那是错误的答案。它不应该包括最后一天。

这是解决方法 -

datediff(days, '2/9/2012 20:55', dateadd(seconds, -1, '3/21/2012 00:00:00') + 1

于 2018-01-25T08:20:24.377 回答