返回天数范围内的唯一日期

时间:2012-05-16 18:23:11

标签: mysql sql

我正在尝试查询使用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。

谢谢, 鲍勃

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

请参阅此回答 - How do I select the number of distinct days in a date range?

在使用@ 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