2017-04-04 56 views
0

我有一個數據庫表events,它有一個列dates存儲日期的陣列,這樣的Sql「其中」比較日期的陣列 - 導軌

eg: ["2017-05-19","2018-04-19","2005-04-19","2017-06-19","2015-04-9"] 

說我在給定的月份值,05。我應該比較dates列中每個事件的月份日期以及所有事件的返回列表,其日期中包含的月份恰好爲05因此,如果event1和event2在日期數組中有月份05,則返回event1和event2。

我試過這個,弄糊塗了。 where("dates @> ARRAY[?]::varchar[]", don't_know_what_to_give_here)

+0

在手機這樣只能給意見。如果沒有人迴應,我會在稍後做完整的回答。基本上,您需要使用strptime方法將字符串日期轉換爲實際日期,然後您可以檢查匹配的月份。 Strptime doc在這裏:(https://apidock.com/ruby/DateTime/strptime/class) – bkunzi01

+0

感謝您的回覆,是的,我們應該使用strptime然後比較..但我們應該通過給定數組中的所有日期來處理事件,並以類似的方式檢查所有事件。但我仍然困惑於這樣做。 –

+1

我建議考慮在將來爲每個具有多個日期等的事件製作一個單獨的event_dates表。但是對於這種情況,由於活動記錄,您可以像處理任何其他數組集合一樣處理psql數組。但是,您不想實例化每個對象,並且只需檢查日期就可以遍歷表中的每個事件。因此,我建議使用'pluck'來獲取所有日期和記錄ID,以便您可以使用正則表達式掃描日期數組,然後將相應的ID添加到其自己的數組中。然後加載ID的數組:@events = Event.where(id:[ids_with_matching_months]) – bkunzi01

回答

0

這是未經測試,但您可以使用生成的字符串Postgres的array_to_string方法,然後LIKE操作。

select * 
from your_table_name 
where array_to_string(dates, ',') LIKE '%-05-%' 

使用Rails

Model.where("array_to_string(dates, ',') LIKE '%-?-%'", month) 
# just make sure month has a leading zero e.g. 01 instead of just 1 
+0

很酷,但如果我以日期格式而不是字符串保存數組。 例如:'[2017年4月4日星期二,2017年4月11日星期二,2017年4月11日,星期二,2017年4月18日星期二,2017年4月25日星期二,2017年5月2日,星期二,2017年5月2日,星期二]類'日期'而不是字符串。 –

+0

然後只是在月份名稱上做一個類似的事情。 – Iceman

+0

好吧,但是如果我想在日期大於>今天時返回事件怎麼辦? –