【问题标题】:Issue with MySQL fetch for events based on date with custom date format and with MySQL condition like events passing through datesMySQL 获取基于日期的事件的问题,具有自定义日期格式和 MySQL 条件(如通过日期的事件)
【发布时间】:2014-07-21 09:23:12
【问题描述】:

我正在加载所有事件并将其显示在日历上。当我点击像 21-07-2014 这样的一天时,它将获取该日期的所有记录,并通过 ajax 显示日历的右侧。我想要实现的是,我想获取 2014 年 7 月 21 日的所有事件以及从 2014 年 7 月 10 日开始并在前结束的事件:'31-07-2014'(通过给定的任何事件活动日期)

活动开始日期字段为 event_date,活动结束日期字段为 end_date

事件表结构:

CREATE TABLE IF NOT EXISTS `events` (
  `event_id` int(11) NOT NULL,
  `event_title` varchar(250) NOT NULL,
  `event_date` datetime NOT NULL,
  `end_date` datetime NOT NULL,
  `location` varchar(100) DEFAULT NULL,
  `description` text,
  `event_photo` varchar(50) DEFAULT NULL,
  `thumbnail` text NOT NULL,
  `photo` text NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_date` datetime DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `modified_date` datetime DEFAULT NULL,
  `modified_by` int(11) DEFAULT NULL,
  `event_share_type` enum('1','0') DEFAULT NULL,
  `delete_status` enum('1','0') DEFAULT '0',
  `remarks` varchar(250) NOT NULL,
  `status` enum('1','0') DEFAULT '1',
  PRIMARY KEY (`event_id`) USING BTREE,
  KEY `delete_status` (`delete_status`) USING BTREE,
  KEY `event_id` (`event_id`,`user_id`,`created_date`,`delete_status`,`status`,`event_share_type`,`end_date`) USING BTREE,
  KEY `remarks` (`remarks`) USING BTREE,
  KEY `status` (`status`) USING BTREE,
  KEY `user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这是我的 Mysql 查询:

SELECT DISTINCT `Events`.`event_id` as id, `Events`.`event_title` AS `title`,
'Events`.`event_date` AS `start`, `Events`.`end_date` AS `end` FROM `events` AS `Events` 
WHERE ((`Events`.`end_date` >= DATE("2014-07-10")) OR (`Events`.`event_date` LIKE '%2014-07-10%') OR (`Events`.`end_date` LIKE '%2014-07-10%')) AND `Events`.`delete_status` = '0' AND `Events`.`status` = '1' ORDER BY `Events`.`created_date` ASC;

这是 CakePhp 发现:

$this->Events->find('all', array(
            'joins'=>$joins,
            'conditions' => array(
                'OR'=>array('Events.end_date >= DATE("'.$dateFormat.'")','Events.event_date LIKE' => "%".$dateFormat."%",'Events.end_date LIKE' => "%".$dateFormat."%")
                ,'Events.delete_status'=>'0','Events.status'=>'1','CP.circuit_id IN '.$my_circuits,'CP.circuit_post_id' => 2,'CP.delete_status'=>'0','CP.status'=>'Y'),
            'order'=>'Events.created_date ASC',  
            'fields'=>array('DISTINCT Events.event_id as id','Events.event_title as title','Events.event_date as start','Events.end_date as end')
        ));

【问题讨论】:

  • 实际上这是 CakePhp 生成的事件查找的 MySQL 转储。它工作得很好,除了让事件通过给定日期的条件说当前日期。
  • End_date 可以大于、等于或喜欢“x”。 那个是怎么工作的!?!
  • 是的,它们是日期时间字段
  • 所以日期开头的通配符没有任何作用。摆脱它,因为它只会让事情变得非常缓慢。
  • 除此之外,如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更容易地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: php mysql cakephp-1.3


【解决方案1】:

听起来您正在寻找在所选日期结束 (23:59:59) 之前某个时间开始并在所选日期开始 (00:00:00) 之后某个时间结束的事件。

尝试对您的 cakephp 查询进行以下调整:

$conditions = array('Events.event_date <' => $dateFormat.' 23:59:59',
                    'Events.end_date >' => $dateFormat.' 00:00:00',
                    'Events.delete_status' => '0',
                    'Events.status' => '1'
                    'CP.circuit_id IN '.$my_circuits,
                    'CP.circuit_post_id' => 2,
                    'CP.delete_status' => '0'
                    'CP.status'=>'Y');
$this->Events->find('all', array(
            'joins' => $joins,
            'conditions' => $conditions,
            'order'=>'Events.created_date ASC',  
            'fields'=>array('DISTINCT Events.event_id as id','Events.event_title as title','Events.event_date as start','Events.end_date as end')
        ));

同样根据cakephp documentation,如果您可以将 $my_circuits 转换为数组,则可以在条件中使用此行而不是'CP.circuit_id IN '.$my_circuits SQL 片段。

"CP.circuit_id" => $my_circuits

文档中给出的演示是:

假设您想查找标题在给定值集中的帖子:

array(
    "Post.title" => array("First post", "Second post", "Third post")
)

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多