为什么必须在指定时间段内选择记录的where条件不能按预期工作?

1yjd4xko  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(378)

我不太喜欢数据库,在处理mysql查询时遇到以下问题:

SELECT
    CCMD.id                                                                 AS crop_calendar_message_details_id,
    CCMD.broadcasting_start_date                                            AS broadcasting_start_date,
    CCMD.broadcasting_end_date                                              AS broadcasting_end_date,
    CCMD.creation_date                                                      AS creation_date,
    CCM.id                                                                  AS message_id,
    CCM.content_en                                                          AS content_en,
    IFNULL(CCMN.content, CCM.content_en)                                    AS content,
    CCMN.audio_link                                                         AS audio_link,
    CCMD.crop_action_details_id                                             AS crop_action_details_id

FROM CropCalendarMessageDetails                                                                             AS CCMD

INNER JOIN CropCalendarMessage                                                                              AS CCM
      ON CCMD.crop_calendar_message_id = CCM.id
LEFT JOIN CropCalendarMessageName                                                                           AS CCMN
     ON CCMN.crop_calendar_message_id = CCM.id AND CCMN.language_id = :language_id 

INNER JOIN CropActionDetails                                                                                AS CAD
      ON CCMD.crop_action_details_id = CAD.id  

WHERE 
    CCMD.commodity_id = 10
AND
    CCMD.country_id = 2
AND
    CAD.id = :cad_id 
AND 
    CCMD.broadcasting_start_date >= CURDATE() 
AND 
    CURDATE() <= CCMD.broadcasting_end_date 
ORDER BY CCMD.broadcasting_start_date

我有一些记录的日期字段具有以下固定值:

CCMD.broadcasting_start_date = 22/12/2018 23:59:00

CCMD.broadcasting_end_date = 30/05/2018

所以理论上我的查询应该跳过这些值,因为我在where子句中设置了以下部分:

AND 
    CCMD.broadcasting_start_date >= CURDATE() 
AND 
    CURDATE() <= CCMD.broadcasting_end_date

问题是这些记录是由我的查询返回的,所以这个日期筛选条件不起作用。
为什么?怎么了?我错过了什么?我该怎么修?

shstlldc

shstlldc1#

在处理日期/时间值和查询时,我个人总是尝试应用>=和<边界。例如,如果你想在2018年3月内完成所有活动,我会做

where '2018-03-01' <= DateTimeField 
  AND DateTimeField < '2018-04-01'

通过做大于或等于一个日期的开始,你可以从午夜开始一直到整个日期周期。至于结束日期,我总是少于第二天(因此是4月1日)。所以我在3月31日晚上11:59:59拿到了所有的东西。
这样,您也不需要仅仅为了确保某个内容在同一天或其时间部分而干扰日期转换函数。
这可能有助于解决查询的日期/时间问题。

相关问题