2012-05-16 69 views
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。

感谢, 鲍勃

+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) 
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