我一直在搜索没有成功的方法来列出我的表条目正在使用的月份。
假设我们有一个表格,其中包含两个日期之间正在使用的项目:
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 :(得分: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)
我会使用MONTH()
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_month
SELECT ID, MONTH(StartDate)
答案 4 :(得分:0)
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;