SQL查询日期之间的月份列表

时间:2013-06-18 13:50:25

标签: sql date

我一直在搜索没有成功的方法来列出我的表条目正在使用的月份。

假设我们有一个表格,其中包含两个日期之间正在使用的项目:

ID   StartDate   EndDate as ItemsInUse

A   01.01.2013   31.03.2013
B   01.02.2013   30.04.2013
C   01.05.2013   31.05.2013

我需要一种方法来查询该表并返回类似的内容:

ID  Month
A   01
A   02
A   03
B   02
B   03
B   04
C   05

我真的很困惑。有没有人有这方面的线索?

PS:欧洲日期格式; - )

5 个答案:

答案 0 :(得分:2)

创建calendar table然后

SELECT DISTINCT i.Id, c.Month
  FROM Calendar c
  JOIN ItemsInUse i 
    ON c.ShortDate BETWEEN i.StartDate AND i.EndDate

答案 1 :(得分:1)

这应该是答案:

select ID, 
       ROUND(MONTHS_BETWEEN('31.03.2013','01.01.2013')) "MONTHS" 
from TABLE_NAME;

答案 2 :(得分:0)

如果您的日期以您建议的方式填充 - 即一位数或几个月的初始值为0 - 您可以使用SUBSTRING函数,如下所示:

SELECT SUBSTRING(StartDate, 3, 2) ...

或者,如果您没有填充,则可以使用:

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(StartDate, '.',2), '.', -1) ...

(后一个命令分为两部分。内部SUBSTRING_INDEX生成一个包含您的日期和月份的字符串,外部SUBSTRING_INDEX生成一个月。)

答案 3 :(得分:0)

答案 4 :(得分:0)

嗯......敢说这可以改进,但作为一个粗略的' n'准备好(假设ms-sql)

create table #results (ID varchar(10), Month int, Year int);

declare @ID varchar(10);
declare @StartDate datetime;
declare @EndDate datetime;

declare myCursor cursor for select [ID], [StartDate],[EndDate] from ItemsInUse;
open myCursor;
delete from #results;
fetch next from myCursor into @ID, @StartDate, @EndDate;
declare @tempDate datetime;
 while @@FETCH_STATUS = 0
begin
    set @tempdate = CAST( CAST(year(@StartDate) AS varchar) + '-' + CAST(MONTH(@StartDate) AS varchar) + '-' + CAST(1 AS varchar) AS DATETIME);
    while @tempDate < @EndDate
    begin
        insert into #results values (@ID, MONTH(@tempDate), YEAR(@tempDate));
        set @tempDate = DATEADD(month,1,@tempdate);
    end

    fetch next from myCursor into @ID, @StartDate, @EndDate;
end

close myCursor;
deallocate myCursor;

select * from #results;
drop table #results;