使用SQL拆分日期

时间:2014-07-01 09:52:44

标签: sql loops

我有一个文件中不同数据记录的开始日期和结束日期。这些日期超过五年。目前,我希望从开始日期到结束日期每隔一年拆分日期。

如何使用sql执行此操作,以便循环包含记录的文件并自动进行拆分以插入到不同的表中?

提前致谢。

2 个答案:

答案 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子句中。你可能那样做。