【问题标题】:Return Unique Dates in Range of Days返回天数范围内的唯一日期
【发布时间】:2018-01-25 16:20:24
【问题描述】:

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

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

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

谢谢, 鲍勃

【问题讨论】:

  • 在您的问题中添加更多详细信息

标签: mysql sql


【解决方案1】:

基本答案是您可以使用 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)

【讨论】:

    【解决方案2】:

    看到这个答案 - 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多