
怎么用SQL语句把两个日期间的所有日期列出一个列表
问题解决了:
1、建立一张数据表My_IDENTITY(id,int),在该表中输入100条记录0,1,...99.
2、select dateadd(day , id , @dt1) from My_IDENTITY where dateadd(day , id , @dt1) <= @dt2
3、使用2,造成dateadd(day , id , @dt1) 运算两次,因此,可以事先算出两个日期相隔的天数@n,使用select dateadd(day, id , @dt1) from My_IDENTITY where id < @n 优化。
4、表My_IDENTITY的记录数可根据情况增加,如果担心还是不够可以select (a.id * 10 + b.id) as id from GP_IDENTITY as a, (select top 10 id from GP_IDENTITY) as b order by id关联一次,由于事先知道相隔的天数,因此能够多次关联得到想要的结果 展开
如果不指定数据库的话,作为通用解决方案:
可以考虑 用一个日历表 ,每天一条记录,这样 你从这个表中 就可以 查询出来了。
递归法(间隔在100以内):
DECLARE @BDate varchar(10); --起始日期,格式:'YYYY-MM-DD'
DECLARE @EDate varchar(10); --结束日期,格式:'YYYY-MM-DD'
SET @BDate='2014-01-01';
SET @EDate='2014-02-25';--生成日期序列
;WITH TDAY AS
(
SELECT @BDate AS FDAY
UNION ALL
SELECT
CONVERT(VARCHAR(10),CAST(M.FDAY AS DATETIME)+1 ,120) AS FDAY
FROM (
SELECT FDAY,RANK() OVER(ORDER BY FDAY DESC) AS RK
FROM TDAY
) M
WHERE (RK=1)AND(FDAY < @EDate)
)
SELECT *
-- INTO #TEMP_DAYLIAT
FROM TDAY ORDER BY FDAY;循环法(无限制):
DECLARE @BDate varchar(10); --起始日期,格式:'YYYY-MM-DD'
DECLARE @EDate varchar(10); --结束日期,格式:'YYYY-MM-DD'
SET @BDate='2014-01-01';
SET @EDate='2014-06-25';
--生成日期列表
CREATE TABLE #TEMP1(FDAY VARCHAR(10));
DECLARE @dtDay DATETIME;
DECLARE @smDay VARCHAR(10);
SET @smDay=@BDate;
WHILE (@smDay<=@EDate)
BEGIN
INSERT INTO #TEMP1(FDAY) VALUES (@smDay);
SET @dtDay = CAST(@smDay AS DATETIME);
SET @smDay= CONVERT(VARCHAR(10),@dtDay+1 ,120);
END;
SELECT * FROM #TEMP1;
DROP TABLE #TEMP1;