我想在2011年1月1日至2011年12月31日期间生成有关sql查询的日期值。
实施例 我的表A
Field A Field B Field C
1 01/01/2011 125
2 03/01/2011 100
3 05/01/2011 50
我想结果:
Field A Field B Field C
1 01/01/2011 125
0 02/01/2011 0
2 03/01/2011 100
0 04/01/2011 0
3 05/01/2011 50
...
0 31/12/2011 0
请给我建议并且非常感谢。
答案 0 :(得分:1)
在SQL Server下,您可以创建一个表值函数,而不是创建一个临时表,因为这可以在查询之间重用:
-- List all of the dates between startdate and enddate (inclusive)
CREATE FUNCTION [dbo].[DatesBetween] (
@startdate date,
@enddate date
) RETURNS @ret TABLE (Date date) AS BEGIN
DECLARE @dt date, @dtEnd date
SELECT @dt = @startdate, @dtEnd = @enddate
WHILE (@dt <= @dtEnd) BEGIN
INSERT INTO @ret VALUES(@dt)
SET @dt = DATEADD(day, 1, @dt)
END
RETURN
END
这允许在一个查询中执行所有操作:
SELECT d.Date, COUNT(t.*) AS TotalOnDay
FROM dbo.DatesBetween('2011-01-01', '2011-12-31') d
LEFT JOIN MyTable t ON t.Date = d.Date
GROUP BY d.Date
答案 1 :(得分:0)
如果“字段B”格式化为日期,则可以使用DATEDIFF函数(Day,StartDate,EndDate) 您也可以将“DATEDIFF(日期)更改为年份,月份或您喜欢的任何其他部分。
希望这会有所帮助。
答案 2 :(得分:0)
在T-SQL中,您可以将查询编写为:
CREATE TABLE #ALLDATE(Date1 date)
DECLARE @startDate DATE='1/1/2011'
DECLARE @endDate DATE='12/31/2011'
insert into #ALLDATE
SELECT [Date] = DATEADD(Day,Number,@startDate)
FROM master..spt_values
WHERE Type='P'
AND DATEADD(day,Number,@startDate) <= @endDate
select * from #ALLDATE