您依赖于 BETWEEN 运算符,这可能会给您带来令人惊讶的结果,而 您 可能会将这些列解释为数字,但 dbms 会将其解释为 char(n) 或 varchar(n) .对于不完整的日期尤其如此。
最简单的方法是避免完全计算,只需在 WHERE 子句中命名您想要的月份。防御性编程也将命名财政年度。
WHERE M_Y IN ('1012', '1112', '1212')
AND FY = 2013
更好的方法是以保留有用(和合理)语义的方式修复您的存储。以下是存储会计期间的两种不同方式,“月优先”和“年优先”。
drop table fiscal_periods;
create table fiscal_periods (
y_m char(4) not null unique,
m_y char(4) not null unique
);
insert into fiscal_periods values ('1201', '0112');
insert into fiscal_periods values ('1202', '0212');
insert into fiscal_periods values ('1203', '0312');
insert into fiscal_periods values ('1204', '0412');
insert into fiscal_periods values ('1205', '0512');
insert into fiscal_periods values ('1206', '0612');
insert into fiscal_periods values ('1207', '0712');
insert into fiscal_periods values ('1208', '0812');
insert into fiscal_periods values ('1209', '0912');
insert into fiscal_periods values ('1210', '1012');
insert into fiscal_periods values ('1211', '1112');
insert into fiscal_periods values ('1212', '1212');
insert into fiscal_periods values ('1301', '0113');
insert into fiscal_periods values ('1302', '0213');
insert into fiscal_periods values ('1303', '0313');
insert into fiscal_periods values ('1304', '0413');
insert into fiscal_periods values ('1305', '0513');
insert into fiscal_periods values ('1306', '0613');
insert into fiscal_periods values ('1307', '0713');
insert into fiscal_periods values ('1308', '0813');
insert into fiscal_periods values ('1309', '0913');
insert into fiscal_periods values ('1310', '1013');
insert into fiscal_periods values ('1311', '1113');
insert into fiscal_periods values ('1312', '1213');
现在尝试一个简单的查询,首先是月份。
-- Select the periods between Oct 2012 and Feb 2013
select m_y
from fiscal_periods
where m_y between '1012' and '0213'
order by m_y;
-- Returns the empty set.
相同的查询,年份优先。
select y_m
from fiscal_periods
where y_m between '1210' and '1302'
order by y_m;
y_m
--
1210
1211
1212
1301
1302
更好的是,避免 Y2K 问题并将年份存储为四位数:201201、201302 等。