我正在尝试查询使用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。
谢谢, 鲍勃
答案 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