一个简单而不一定是非常有效的方法是日期和月份值转换为实际日期,使用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