我有一个文件中不同数据记录的开始日期和结束日期。这些日期超过五年。目前,我希望从开始日期到结束日期每隔一年拆分日期。
如何使用sql执行此操作,以便循环包含记录的文件并自动进行拆分以插入到不同的表中?
提前致谢。
答案 0 :(得分:0)
我不会使用循环。
你应该这样做。
SELECT t.info, YEAR(t.Date)
FROM yourtable AS t
WHERE t.Date BETWEEN @StartDate AND @EndDate
答案 1 :(得分:0)
您可以获取行的“年度化”子集,而无需将其写入其他表。通常,您应该避免将它们写入其他表。当原始表中的数据发生更改时,快速将行写入其他表会成为一种维护问题。根据表中的其他数据,将行写入其他表会使得很难(如果不是不可能)运行准确的聚合查询(使用min(),max(),sum(),avg()等查询)。
我们制作一张桌子。
create table test (
start_date date,
end_date date
);
-- Start in 2005; lasts more than a year.
insert into test values ('2005-03-02', '2014-12-31');
-- Start in 2005; lasts less than a year.
insert into test values ('2005-03-02', '2005-10-18');
-- Not in 2005.
insert into test values ('2006-02-15', '2008-11-13');
要获取所有“2005”行,您可以运行此查询。我假设你想要start_date的实际值,如果它恰好晚于2005-01-01。
select
case when '2005-01-01' between start_date and end_date
then '2005-01-01' else start_date
end start_date,
case when '2005-12-31' between start_date and end_date
then '2005-12-31' else end_date
end end_date
from test
where 2005 between extract(year from start_date) and extract(year from end_date)
order by start_date, end_date;
start_date end_date -- 2005-03-02 2005-10-18 2005-03-02 2005-12-31
以类似的方式获取所有“2006”行。
select
case when '2006-01-01' between start_date and end_date
then '2006-01-01' else start_date
end start_date,
case when '2006-12-31' between start_date and end_date
then '2006-12-31' else end_date
end end_date
from test
where 2006 between extract(year from start_date) and extract(year from end_date)
order by start_date, end_date;
start_date end_date -- 2006-01-01 2006-12-31 2006-02-15 2006-12-31
当然,您可以将这些语句包装在create view
子句中。你可能那样做。