【问题标题】:mysql date between period期间之间的mysql日期
【发布时间】:2012-01-09 15:24:12
【问题描述】:

数据库结构:

activities: id, description, date, time, endDate, endTime, userId

所以我们得到了一个activity,它需要有一个日期,时间,endDate和endTime不是必需的。

问题是,如果我想获得今天的所有活动,我得到了:

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE DATE(A.date) = DATE(CURDATE())

这样就死了,得到今天的所有活动,但是如果我们得到一个昨天开始的活动,而结束日期是明天,我还得得到这个活动呢?

我们想要下周末发生的所有活动,所以我们得到了这个查询:

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE UNIX_TIMESTAMP(A.DATE) BETWEEN strtotime('previous saturday') 
AND (strtotime('previous monday') - 1)

但是再一次,如果“约会”是在星期五并将在星期二结束,而我得到了周末发生的所有活动,我仍然必须得到那个活动,我该如何解决这个问题?

非常感谢您的帮助! :)

【问题讨论】:

  • endDate 可以为空吗?在那种情况下,您是否认为该事件将永远持续下去?
  • 不会,只会持续一天

标签: mysql date between period


【解决方案1】:
SELECT A.*, U.*
FROM activities
  JOIN users U
    ON U.id = A.userId
  CROSS JOIN                                  --- example: test dates
    ( SELECT CURDATE()    AS startDate        --- between today and 
           , CURDATE() + INTERVAL 3 DAY
                          AS endDate          --- 3 days from now
    ) AS Check
WHERE (   A.endDate IS NULL
      AND A.`date` BETWEEN Check.startDate
                       AND Check.EndDate
      )
   OR (   A.`date` <= Check.EndDate
      AND Check.StartDate <= A.endDate 
      )

【讨论】:

    【解决方案2】:

    假设您没有包含date &gt; endDate 的记录,以下应该适合您:

    SELECT 
      a.*,
      a.begin_date activityBeginDate,
      IF(a.end_date IS NULL, a.begin_date, a.end_date) activityEndDate
    FROM activity a
    WHERE
      begin_date <= '2011-01-07' AND (end_date IS NULL OR end_date >= '2011-01-06')
    HAVING
      (activityBeginDate <= '2011-01-06' AND activityEndDate >= '2011-01-06')
      OR
      (activityBeginDate >= '2011-01-07')
    ORDER BY activityBeginDate
    

    为简单起见,我删除了与用户表的联接,但您可以毫无问题地添加它。此查询假定您正在查找 2011 年 1 月 6 日到 2011 年 1 月 7 日之间“活跃”的事件。

    所以我们在这里要做的是列出在我们想要的结束日期之前开始的所有事件,或者将在我们想要的开始日期之后结束的所有事件。在这种情况下,您将列出将在您希望的结束日期之前结束的事件。如果这是一个问题,您可以使用附加条件过滤它们。

    我会进一步尝试改进这个查询,它可能做的过度工作可以简化。

    【讨论】:

    • case 'today': $return = ' AND activityBeginDate = DATE(CURDATE())';这就是我现在得到的,但它不起作用(我已经在 SELECT 查询中添加了额外的东西;))
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 2013-04-27
    • 2012-09-05
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多