【问题标题】:Not getting expected results with the query I've in MySQL我在 MySQL 中的查询没有得到预期的结果
【发布时间】:2020-05-24 03:23:31
【问题描述】:

我有下面的表结构,它有日班。

只有 C 班,时间共享两天。

您可以C班次从 20:30 开始,并在接下来的几天 06:00 结束。

Table结构及数据如下

create table `machine_shifts` (
   `date` date ,
   `shift_start_time` time ,
   `shift_end_time` time ,
   `shift` varchar (60),
   `updated_on` timestamp 
);

insert into `machine_shifts` (`date`, `shift_start_time`, `shift_end_time`, `shift`, `updated_on`) values('2010-01-01','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-01','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-01','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-02','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-02','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-02','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-03','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-03','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-03','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-04','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-04','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-04','22:30:00','06:00:00','C','2020-01-29 15:37:27');

数据表示如下

现在我想要的是,我想检索两个给定时间线之间的数据,其中包括来自上述数据集的转变。我有以下查询

SELECT * FROM machine_shifts
WHERE ((CONCAT(`date`, ' ', shift_start_time))
   BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 10:00:00')
OR   (CONCAT(`date`, ' ', shift_end_time)
   BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 10:00:00') 
ORDER BY `date`, shift_start_time ASC

通过上面的查询,我得到的是

在上面提取的结果集中,最后一行不是预期的,也不应该显示我也想在第一行中检索 2010-01-01 的 C 移位,即使我正在传递 2010-01 -02 00:00:00,因为它应该属于 2010-01-01 的 C 班次。
这是我期待的以下结果

我怎样才能实现它?

【问题讨论】:

  • 考虑将日期和时间存储为单个实体

标签: mysql sql date datetime select


【解决方案1】:

您的查询看起来不错;您只需要一点条件逻辑来调整班次 C 的结束日期。

应该这样做:

SELECT * FROM machine_shifts
WHERE 
    CONCAT(`date`, ' ', shift_start_time)
        BETWEEN '2010-01-02 00:00:00' 
        AND '2010-01-03 10:00:00')
    OR CONCAT(`date`, ' ', shift_end_time) + INTERVAL (shift = 'C') DAY
        BETWEEN '2010-01-02 00:00:00' 
        AND '2010-01-03 10:00:00'
ORDER BY `date`, shift_start_time ASC

我们的想法是在我们遇到 C 班次结束时在计算中增加一天。这就是表达式+ INTERVAL (shift = 'C') DAY 的作用。

请注意,此处不需要条件周围的嵌套括号。

【讨论】:

  • 它正在处理所有查询,但除了这个 BETWEEN '2010-01-01 07:01:00' AND '2010-01-01 14:00:00' 你能帮我解决吗它
  • 嗨,你能检查一下上面的评论吗?
  • @KishoreKumarKorada:我在您的示例数据中没有看到开始或结束时间满足此条件的记录...第一条记录的开始时间 before @987654323 @ 和结束时间之后 '2010-01-01 14:00:00'.
  • 我很遗憾没有提到这一点。但我认为它也适用于这种情况。不应该在每个测试用例中都满足吗?
  • 我应该为这种情况添加另一个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多