Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期之间月份的SQL查询列表_Sql_Date - Fatal编程技术网

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

日期之间月份的SQL查询列表,sql,date,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

我一直在寻找一种方法来列出我的表条目使用的月份,但没有成功

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

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:欧洲日期格式-

然后创建一个


如果您的日期是按照您建议的方式填充的,即一位数的日期或月份的首字母为0,则您可以使用子字符串函数,如下所示:

SELECT SUBSTRING(StartDate, 3, 2) ...
或者,如果没有填充,可以使用:

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(StartDate, '.',2), '.', -1) ...
后一个命令分为两部分。内部子字符串索引生成一个包含日期和月份的字符串,外部子字符串索引取月份。

我将使用月份


嗯。。。我敢说这是可以改进的,但作为一个粗略的“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;

答案应该是:

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

您使用的是哪种rdbms?看看我的解决方案,它实现了相同的功能,但不使用日历表。。。
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;
select ID, 
       ROUND(MONTHS_BETWEEN('31.03.2013','01.01.2013')) "MONTHS" 
from TABLE_NAME;