mysql - Mysql-cast 和 convert in join 不起作用
问题描述
在 MySQL 表中,它们存储return_time
为 VARCHAR(20) 和return_date
日期字段。现在我必须根据给定的日期和时间进行比较并产生结果。例如,保存在时间列中的记录将像“10:00 PM”、“11:00 PM”、“02:00 AM”等,而保存在日期列中的记录将像“2021-02-02”、“2021-” 01-02'等
我结合了return_date
and return_time
,并将其与给定的日期和时间进行比较,例如
SELECT *
FROM `travel_infos` as TravelInfo
WHERE TravelInfo.travel_status = 'Open' AND
cast(concat(TravelInfo.return_date, ' ', STR_TO_DATE(TravelInfo.return_time, '%l:%i %p' )) as datetime) > '2021-03-03 14:03'
它向我输出 231 条记录。travel_infos
表有 700 条记录。
然后我在不考虑return_time
列的情况下进行连接
SELECT Part.*,TravelInfo.*,Category.*,Buttons.*
FROM travel_infos As TravelInfo
LEFT JOIN parts as Part ON Part.id = TravelInfo.part_id_1
LEFT JOIN buttons as Buttons ON Part.button_name_id= Buttons.id
LEFT JOIN categories as Category ON Part.category_id = Category.id
WHERE Part.id != 0 AND TravelInfo.id!=0
AND Part.part_type IN('Charter') AND Part.store_id='1'
AND TravelInfo.travel_status = 'Open'
AND TravelInfo.return_date >= '2021-03-03 14:03'
AND Part.is_delete=0
它输出了 175 条记录。
所以现在我想通过同时考虑return_date
和来加入return_time
。所以我试着像
SELECT Part.*,TravelInfo.*,Category.*,Buttons.*
FROM travel_infos As TravelInfo
LEFT JOIN parts as Part ON Part.id = TravelInfo.part_id_1
LEFT JOIN buttons as Buttons ON Part.button_name_id= Buttons.id
LEFT JOIN categories as Category ON Part.category_id = Category.id
WHERE Part.id != 0 AND
TravelInfo.id!=0
AND Part.part_type IN('Charter')
AND Part.store_id='1'
AND TravelInfo.travel_status = 'Open'
AND (cast(concat(TravelInfo.return_date, ' ',
STR_TO_DATE(TravelInfo.return_time, '%l:%i %p' )) as datetime)) >= '2021-03-03 14:03' AND Part.is_delete=0
这会输出 0 条记录。第三个 SQL 查询出了什么问题?第 1 和第 2 都产生输出。在我的第三个查询中,我修改了第二个查询,WHERE
就像在第一个查询中一样。
有人可以帮我解决这个问题吗谢谢。
解决方案
将您要比较的两个日期都转换为 where 子句中的日期时间:
SELECT Part.*,TravelInfo.*,Category.*,Buttons.*
FROM travel_infos As TravelInfo
LEFT JOIN parts as Part ON Part.id = TravelInfo.part_id_1
LEFT JOIN buttons as Buttons ON Part.button_name_id= Buttons.id
LEFT JOIN categories as Category ON Part.category_id = Category.id
WHERE Part.id != 0 AND
TravelInfo.id!=0
AND Part.part_type IN('Charter')
AND Part.store_id='1'
AND TravelInfo.travel_status = 'Open'
AND TravelInfo.return_date >= STR_TO_DATE('2021-03-03', '%Y-%m-%d')
AND cast(TravelInfo.return_time as time) >= cast('14:03:00' as time)
AND Part.is_delete=0
推荐阅读
- ruby-on-rails - 使用基于 API 密钥的身份验证时使用的正确标头是什么
- android - mvvm 使用 dagger2 和 ViewModelFactory,不理解默认注入
- cython - 如果有同名的属性,Cython 不能引用 cdef 类中的声明类型?
- docker - Docker BuildKit 是否被认为是稳定的/生产友好的?
- javascript - 在输入字段下方使用带有自定义消息的 javascript 进行电子邮件验证
- html - jQuery 音量 UI 与我推出的不同?
- python - 发送并运行多行 Python 到一个可见的正在运行的 python/bpython/ipython 解释器进程
- c# - 如何获得按月运行的总数
- django - 如何使用注释在多个表中创建反向外键
- javascript - 在可过滤表中搜索“清除按钮”javascript 问题