选择MySQL行,其中某个月位于两个日期字段之间

时间:2014-03-20 03:06:01

标签: php mysql sql wordpress date

我有一个每月显示事件的页面。每个事件都有一个start_date和finish_date作为yymmdd。如果一个事件跨越两个不同的月份,它应该在每个月显示它跨越。例如,如果我的开始日期为2014年3月19日,结束日期为2014年6月19日,那么它应该出现在3月,4月,5月和6月。

我一直在尝试使用meta_query在wordpress中执行此操作,但我认为它不可能:

        // Get chosen month to display from URL
$events_month = sanitize_text_field($_GET["month"]);
$events_year = sanitize_text_field($_GET["year"]);

// Convert chosen month to display to a timestamp
$ts = strtotime("$events_month $events_year");

// Create chosen month start end end dates to use for query
$month_start_date = date('Ym01', $ts);
$month_end_date = date('Ymt', $ts);

$args = array(
    'post_type' => 'events',
    'posts_per_page' => 50,
    'order' => 'ASC',
    'orderby' => 'meta_value_num',
    'meta_key' => 'start_date',
    'meta_query'        => array(
        array(
            'key' => 'start_date',
            'value' => array($month_start_date, $month_end_date),
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        )
    )
);

$events = new WP_Query($args);

所以,我正在寻找纯粹的MySQL解决方案。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

我不能告诉你很多关于WP meta queries的内容,但SQL中的WHERE子句应涵盖所有四种类型的事件持续时间:
发生的事件

  • 从当月开始,
  • 在当月结束,
  • 仅在当月(意味着以前的条件),
  • 跨越整个当月

查询:

SELECT ... FROM ... WHERE
    start_date BETWEEN month_start AND month_end
    OR end_date BETWEEN month_start AND month_end
    OR month_start BETWEEN start_date AND end_date

<小时/> 编辑:
实际上,更容易的解决方案是选择

的事件
  • 在当月或之前开始
  • AND在本月内或之后结束

查询;

SELECT ... FROM ... WHERE
    WHERE start_date <= month_end
    AND end_date >= month_start

如果不了解元查询内容(我的引用是this),您希望 的工作方式如下:

'meta_query' => array(
    'relation' => 'AND', // default is AND
    array(
        'key' => 'start_date',
        'value' => $month_end_date,
        'type' => 'numeric',
        'compare' => '<='
    ),
    array(
        'key' => 'end_date',
        'value' => $month_start_date,
        'type' => 'numeric',
        'compare' => '>='
    )
),