日期:2014-05-19  浏览次数:20545 次

查寻日期问题
小弟请教一个查寻的日期问题,问题如下:

以下是十一月的销售报告,我如何可以得到左面是具体日期(例如:   11/1/2006),右边是具体销售额的查寻结果呢?请注意下面的数据中12日没有销售数据,如何能在左侧显示11月的所有日期,而且将12日的数据显示为0,而不是NULL.
谢谢!

1   $1,722.97  
2   $2,161.02  
3   $2,090.73  
4   $2,213.71  
6   $1,759.49  
7   $1,713.14  
8   $1,701.17  
9   $2,291.87  
10   $2,040.68  
11   $2,123.06  
13   $1,864.47  
14   $1,750.59  
15   $1,948.97  
16   $2,148.17  
17   $2,026.26  
18   $2,032.09  
20   $1,897.51  
21   $1,771.48  
22   $1,896.66  
23   $2,024.81  
24   $1,882.29  
25   $1,976.44  
27   $1,724.65  
28   $1,697.80  
29   $1,768.01  
30   $2,210.79  


------解决方案--------------------
--准备工作,建一个函数
/*--生成列表

生成指定日期段的日期列表

--邹建 2005.03(引用请保留此信息)--*/

/*--调用示例

--查询工作日
SELECT * FROM dbo.f_getdate( '2005-1-3 ', '2005-4-5 ',0)

--查询休息日
SELECT * FROM dbo.f_getdate( '2005-1-3 ', '2005-4-5 ',1)

--查询全部日期
SELECT * FROM dbo.f_getdate( '2005-1-3 ', '2005-4-5 ',NULL)
--*/

CREATE FUNCTION dbo.f_getdate(
@begin_date Datetime, --要查询的开始日期
@end_date Datetime, --要查询的结束日期
@bz bit --@bz=0 查询工作日,@bz=1 查询休息日,@bz IS NULL 查询全部日期
)RETURNS @re TABLE(id int identity(1,1),Date datetime,Weekday nvarchar(3))
AS
BEGIN
DECLARE @tb TABLE(ID int IDENTITY(0,1),a bit)
INSERT INTO @tb(a) SELECT TOP 366 0
FROM sysobjects a ,sysobjects b

IF @bz=0
WHILE @begin_date <=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date <=@end_date
AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7 BETWEEN 1 AND 5
SET @begin_date=DATEADD(Day,366,@begin_date)
END
ELSE IF @bz=1
WHILE @begin_date <=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date <=@end_date
AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7 in(0,6)
SET @begin_date=DATEADD(Day,366,@begin_date)
END
ELSE
WHILE @begin_date <=@end_date
BEGIN
INSERT INTO @re(Date,Weekday)
SELECT Date,DATENAME(Weekday,Date)
FROM(
SELECT Date=DATEADD(Day,ID,@begin_date)
FROM @tb
)a WHERE Date <=@end_date
SET @begin_date=DATEADD(Day,366,@begin_date)
END

RETURN
END
GO


--创建测试环境
create table #t(id int,amount varchar(20))

--插入测试数据
insert #t(id,amount)
select '1 ', '$1,722.97 ' union all
select '2 ', '$2,161.02 ' union all
select '3 ', '$2,090.73 ' union all
select '4 ', '$2,213.71 ' union all
select '6 ', '$1,759.49 ' union all
select '7 ', '$1,713.14 ' union all
select '8 ', '$1,701.17 ' union all
select '9 ', '$2,291.87 ' union all
select '10 &#