【问题标题】:check dates on database检查数据库上的日期
【发布时间】:2018-04-16 04:32:36
【问题描述】:

在我的数据库表中,我有 2 列,start_date 和 end_date。

示例数据为:

-------------------------------
start_date     |     end_date
-------------------------------
2017-11-01           2017-11-02
2017-11-03           2017-11-07
2017-11-20           2017-11-28
2017-11-13           2017-12-02
-------------------------------

我需要查找是否有连续5天没有使用,在这种情况下,有:

(2017-11-08 to 2017-11-13)

我正在使用 PHP 和 MySQL。

提前致谢!

【问题讨论】:

  • @Michel,我认为这不是重复的,因为虽然它可能使用该功能是解决方案,但问题是不同的
  • 我已经尝试过类似于 Michel 的建议的方法,但我一直坚持如何找到未使用的日期。
  • 您是否要验证指定的日期范围是否有效,或者是否有一个范围是 5 天,它是什么?
  • 是否需要检查两列的连续日期?

标签: php mysql


【解决方案1】:

您需要根据您的实际数据以及是否没有重叠日期来检查极端情况,但这对于所提供的数据来说是一个良好的开端。

假设表和数据定义如下:

CREATE TABLE
  `appointments`
 (
     `appointment_id` INT PRIMARY KEY AUTO_INCREMENT,
     `start_date` DATE,
     `end_date` DATE
 );

INSERT INTO
     `appointments`
 (`start_date`, `end_date`)
 VALUES
 ('2017-11-01', '2017-11-02'),
 ('2017-11-03', '2017-11-07'),
 ('2017-11-20', '2017-11-28'),
 ('2017-11-13', '2017-12-02');

如果您对行进行排序,并从其之前的结束日期算起滞后,并采取任何 5 或更多的间隔。在 SQL Server 中有 LAG 函数,但这里有一种方法可以做到这一点。然后,一旦您有一个包含所有行及其相应间隔的表格,您就可以获取该期间的开始日期,并根据之间的天数创建间隔期间。由于TIMESTAMPDIFF包含在内,所以需要减去一天。

SET @end_date   = NULL;

SELECT 
   DATE_ADD(`start_date`, INTERVAL -(`gap_from_last`-1) DAY) AS `start_date`,
   `start_date` AS `end_date`
FROM
(
SELECT
    `appointment_id`,
    CASE 
      WHEN @end_date IS NULL THEN NULL
      ELSE TIMESTAMPDIFF(DAY, @end_date, `start_date`) 
    END AS `gap_from_last`,
    `start_date`,
    @end_date   := `end_date` AS `end_date`  -- Save the lag date from the row before
FROM
    `appointments`
ORDER BY
    `start_date`,
    `end_date`
) AS `date_gap` -- Build table that has the dates and the number of days between
WHERE
  `gap_from_last` > 5;

提供:

start_date | end_date
------------------------
2017-11-08 | 2017-11-13

编辑:糟糕!忘记了 SQLFiddle (http://sqlfiddle.com/#!9/09cfce/16)

【讨论】:

  • 哇,这正是我想要的!非常感谢!
【解决方案2】:
SELECT x.end_date + INTERVAL 1 DAY unused_start
     , MIN(y.start_date) unused_end 
  FROM appointments x 
  JOIN appointments y 
    ON y.start_date >= x.end_date 
 GROUP 
    BY x.start_date  
HAVING DATEDIFF(MIN(y.start_date),unused_start) >= 5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2019-06-15
    • 2017-07-28
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多