簡體   English   中英

選擇兩個日期字段之間某個月份的MySQL行

[英]Select MySQL rows where a certain month is between two date fields

我有一個頁面,按月顯示事件。 每個事件都有一個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解決方案。 有什么幫助嗎?

關於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' => '>=' ) ), 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM