一個簡單而不一定是非常有效的方法是日期和月份值轉換爲實際日期,使用to_date()
,然後比較,與你的目標日期範圍:
select * from card
where to_date(lpad(expireday, 2, '0')
||'/'|| lpad(expiremonth, 2, '0'), 'DD/MM')
between sysdate and add_months(sysdate, 1);
Which appears to work。但是如果日期跨越年底,這將會有問題。由於您的表格未指定年份,因此您必須先完成一項工作,或允許to_date
將其默認爲當前年份。如果你讓它默認,那麼它將無法工作。例如,如果您的表格中包含12月和1月的值,並在12月運行此查詢,則1月日期將被視爲2014年1月,並且不會計入下個月。所以你需要做更多的選擇合適的一年。
這在當前爲下一個年,這可能是配不上你,你只需要一個月的窗口前,把任何一個月份的數字:使用從日期範圍
select * from card
where to_date(lpad(expireday, 2, '0')
||'/'|| lpad(expiremonth, 2, '0')
||'/'|| (extract(year from sysdate) +
case when expiremonth < extract(month from sysdate) then 1 else 0 end),
'DD/MM/YYYY')
between sysdate and add_months(sysdate, 1);
SQL Fiddle十二月至一月。
而且你可以看到兩列合併的方式形成日期in this Fiddle。
像往常一樣,道德是......將事物存儲爲正確的數據類型。將日期存儲爲日期,而不是字符串或數字。
你爲什麼要在單獨的列中保存日期和月份,並且你還有一年的專欄?你的2天間隔調整似乎與你所說的你想做的事情不符 - 在下個月尋找「日期」?是在10月的任何時候,還是從現在到10月22日? – 2014-09-22 14:38:21
@AlexPoole數據庫是第三個,所以我無法控制它。而2天的時間間隔就是一個例子,你可以把所需的一切都放在那個查詢中。 – gog 2014-09-22 14:41:26