Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中按月份和年份比较日期_Mysql_Sql - Fatal编程技术网

在mysql中按月份和年份比较日期

在mysql中按月份和年份比较日期,mysql,sql,Mysql,Sql,我有一个表,其中包含有关活动和节日的数据,以下列记录了它们的开始和结束日期 开始日期 结束日期 日期格式为YYYY-MM-DD。我需要获取具有以下条件的事件详细信息 需要获取以当前月份开始的所有事件,并且这些事件的结束日期可以是currentDate+Next30天。 我很清楚结束日期的概念。但我不确定如何获取开始日期在当前月份的数据。 为此,我需要将当前年份和当前月份与数据库中的“开始日期”列进行比较 有人能帮我指出我该怎么做吗?你是朋友吗: SELECT * FROM `ev

我有一个表,其中包含有关活动和节日的数据,以下列记录了它们的开始和结束日期

开始日期 结束日期 日期格式为YYYY-MM-DD。我需要获取具有以下条件的事件详细信息

需要获取以当前月份开始的所有事件,并且这些事件的结束日期可以是currentDate+Next30天。 我很清楚结束日期的概念。但我不确定如何获取开始日期在当前月份的数据。 为此,我需要将当前年份和当前月份与数据库中的“开始日期”列进行比较

有人能帮我指出我该怎么做吗?

你是朋友吗:

SELECT
    *
FROM
    `event`
WHERE
    (MONTH(NOW()) = MONTH(`Start_Date`))
    AND
    (`End_Date` <= (NOW() + INTERVAL 30 DAY))
    AND
    (YEAR(NOW()) = YEAR(`Start_Date`))

我不喜欢其他两个答案中的任何一个,因为它们不允许优化器在开始日期使用索引。为此,函数需要位于当前日期端

因此,我会选择:

where start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and
      start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month)

这仍然可以利用指数。

分别比较年份和月份会让人感觉混乱。我想把它写在一行里。我怀疑它会在表现上产生明显的差异,所以这纯粹是个人偏好

select * from your_table
where LAST_DAY(Start_Date) = LAST_DAY(curdate())
and end_date <= curdate() + interval 30 day

总是忘记CURDATE函数:),所以+1我认为现在更容易记住。@daVe:现在返回日期和时间。curdate只显示日期。@juergen:没错,但是在这样的查询中,您会得到类似的结果,请注意比较!感谢您提供快速解决方案+1
where (start_date >= date_add(curdate(), interval 1 - day(curdate()) day) and
       start_date < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 1 month)
      ) and
      end_date <= date_add(curdate(), interval 30 day)
select * from your_table
where LAST_DAY(Start_Date) = LAST_DAY(curdate())
and end_date <= curdate() + interval 30 day
where DATE_FORMAT(Start_Date ,'%Y-%m-01') = DATE_FORMAT(curdate(),'%Y-%m-01')