当前位置: 代码迷 >> Sql Server >> 前几天问了个有关问题,需要补充一点有关问题
  详细解决方案

前几天问了个有关问题,需要补充一点有关问题

热度:88   发布时间:2016-04-24 10:28:54.0
前几天问了个问题,需要补充一点问题
知道起始日期和结束日期,怎么循环生成各个日期到数据库中, 
版主给我的建议是用循环:

 
-- 建测试表
create table datelist(xz datetime)
 
 
-- 插入数据
declare @begindate datetime,@enddate datetime
 
select @begindate='2014/05/01',  -- 起始日期
       @enddate='2014/06/17'     -- 结束日期
 
while(@begindate<=@enddate)
begin
 insert into datelist(xz) values(@begindate)
 select @begindate=dateadd(d,1,@begindate)
end


我补充的问题是,假如给的是起始时间和结束时间呢?
比如:

-- 插入数据
declare @begindate datetime,@enddate datetime
 
select @begindate='2014/05/01 10:10:00',  -- 起始日期
           @enddate='2014/05/05 15:00:00'     -- 结束日期

而我要的结果是:
2014-05-01 10:10:00.000
2014-05-02 00:00:00.000
2014-05-03 00:00:00.000
2014-05-04 00:00:00.000
2014-05-05 15:00:00.000
因为5月1日是从10点开始的,而结束是在5日的15点结束。

------解决方案--------------------
declare @sdate datetime 
declare @edate datetime 
set @sdate ='2014/05/01 10:10:00'
set @edate ='2014/05/05 15:00:00'


select 
    dateadd(dd,num,@sdate) 
from 
    (select isnull((select count(1) from sysobjects where id <t.id),0) as num from sysobjects t) a 
where 
    dateadd(dd,num,@sdate) <=@edate 

-------------------------------------------------------------------------------------------------------------


declare @startdate datetime,@enddate datetime
set @startdate='2014/05/01 10:10:00'
set @enddate='2014/05/05 15:00:00'
select convert(varchar(10),dateadd(day,number,@startdate),120) 
from
    master..spt_values 
where 
    datediff(day,dateadd(day,number,@startdate), @enddate)>=0
    and number>0 
    and type='p'

------解决方案--------------------
	
DECLARE @StartDate DATETIME ='2014/05/01 10:10:00'
,@EndDate DATETIME ='2014/05/05 15:00:00'
IF OBJECT_ID('tempdb..#EveryDays','U') IS NOT NULL DROP TABLE #EveryDays
CREATE TABLE #EveryDays
(
 Dates DATETIME
 )

 INSERT INTO #EveryDays VALUES(@StartDate)
 SET @StartDate=CAST(CONVERT(CHAR(8),DATEADD(DAY,1,@StartDate),112) AS DATETIME)

WHILE @StartDate<CAST(CONVERT(CHAR(8),@EndDate,112) AS DATETIME)
BEGIN
  INSERT INTO #EveryDays VALUES(@StartDate )
  SET @StartDate=DATEADD(DAY,1,@StartDate)
END

INSERT INTO #EveryDays VALUES(@EndDate) 

SELECT * FROM #EveryDays

------解决方案--------------------

-- 建测试表
create table datelist(xz datetime)
  
  
-- 插入数据
declare @begindate datetime,@enddate datetime
  
select @begindate='2014/05/01 10:10:00',  -- 起始日期
       @enddate='2014/05/05 15:00:00'     -- 结束日期
  
while(@begindate<=@enddate)
begin
 insert into datelist(xz) 
   select case when datediff(d,@begindate,@enddate)=0 then @enddate else @begindate end
 
 select @begindate=dateadd(d,1,convert(varchar,@begindate,111))
end


-- 结果
select * from datelist

/*
xz
-----------------------
2014-05-01 10:10:00.000
2014-05-02 00:00:00.000
2014-05-03 00:00:00.000
2014-05-04 00:00:00.000
2014-05-05 15:00:00.000

(5 row(s) affected)
*/

------解决方案--------------------
declare @begindate datetime,@enddate datetime
  
select @begindate='2014/05/01 10:10:00',  -- 起始日期
       @enddate='2014/06/17 15:30:00'     -- 结束日期
  
insert into datelist select @begindate
insert into datelist select @enddate
while @begindate< DateAdd(d,-2,@enddate)
begin

insert into datelist select CONVERT(varchar(100), DateAdd(d,1,@begindate), 23) 
set @begindate=DateAdd(d,1,@begindate)
end

go
select * from  datelist order by  xz desc

我这个稍微笨一点的方法你试试
------解决方案--------------------
引用:

-- 建测试表
create table datelist(xz datetime)
  相关解决方案