如何将字符串类型的时间段形成表数据?

wujinpinga 2007-08-15 04:10:22
例如已知起始日期为20060708,结束日期为20060710
然后程序遍历起始日期和结束日期,得到20060708、20060709、20060710三个日期
然后用这些日期形成表数据也就得到SQL
select '20060708' rq union select '20060709' rq union select '20060710' rq

这样的处理对于数据量较小的情况下不会有错误,但是如果起始日期20060101,结束日期为20080910的话,由于时间跨度大,导致生成SQL语句过长而不能执行

请教是否有别的方式来实现该问题已解决目前遇到的问题?
...全文
194 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2007-08-15
  • 打赏
  • 举报
回复
也可以,不過每次執行存儲過程前要將表刪除掉。
wujinpinga 2007-08-15
  • 打赏
  • 举报
回复
可以解决了,原来想从复杂的程序进行逻辑控制来实现,但是发现工作量太大,后来又仔细想了下你给出的解决方法,所以将
Select TOP 2000 ID = Identity(Int, 0, 1) Into #T From SYsColumns A, SysColumns B
中的#T表转为永久中间表,并以此构建日期序列,月份序列,年份序列,周序列,形成数据表作为大查询中的一部分,进行进一步的查询
paoluo 2007-08-15
  • 打赏
  • 举报
回复
怎麼不能解決?說說看。
wujinpinga 2007-08-15
  • 打赏
  • 举报
回复
paoluo(一天到晚游泳的鱼) ,谢谢你的回答,但是还不能解决我的问题,我打算寻找其他的办法。
paoluo 2007-08-15
  • 打赏
  • 举报
回复
你可以將這個存儲過程的結果集生成一個臨時表,然後使用這個臨時表參與查詢。

Create Table #T (日期 DateTime)
Insert #T EXEC SP_TEST '20060101', '20080910'
select a1,a2,a3,b1,b2,rq from a,b, #T C
wujinpinga 2007-08-15
  • 打赏
  • 举报
回复
非常感谢 paoluo(一天到晚游泳的鱼) ,我这里的时间延滞,我这是对1楼的兄弟说的。

paoluo(一天到晚游泳的鱼):

这里所得到的数据表为作为一个大查询中的一个子查询,即

select a1,a2,a3,b1,b2,rq from a,b,(select '200060101' rq union ...select '20080901' rq)

感谢paoluo(一天到晚游泳的鱼)的回答。
paoluo 2007-08-15
  • 打赏
  • 举报
回复
--創建存儲過程
Create ProceDure SP_TEST(@起始日期 DateTime, @结束日期 DateTime)
As
Begin
Select TOP 2000 ID = Identity(Int, 0, 1) Into #T From SYsColumns A, SysColumns B

Select
Convert(Varchar, DateAdd(dd, ID, @起始日期), 112) As 日期
From
#T
Where ID <= DateDiff(dd, @起始日期, @结束日期)

Drop Table #T
End
GO
--調用存儲過程
EXEC SP_TEST '20060101', '20080910'

--結果
/*
日期
20060101
20060102
20060103
20060104
20060105
...
20080907
20080908
20080909
20080910
*/
paoluo 2007-08-15
  • 打赏
  • 举报
回复
wujinpinga(滴水穿石) ( ) 信誉:100 2007-08-15 16:24:09 得分: 0


能够说清楚的么?是用SQL写么?如何写?盼答复,谢谢。


----------
難道上面不是用SQL寫的?

這樣吧,我將代碼放入存儲過程中,你建立存儲過程後,直接執行存儲過程即可。

wujinpinga 2007-08-15
  • 打赏
  • 举报
回复
能够说清楚的么?是用SQL写么?如何写?盼答复,谢谢。
wgzaaa 2007-08-15
  • 打赏
  • 举报
回复
鱼 的方法好
kk19840210 2007-08-15
  • 打赏
  • 举报
回复
declare @i int
select @i=datediff(day,'20060101','20080910')

set rowcount @i
select identity(int,1,1) as id,convert(datetime,'20060101',120) as [time] into # from sysobjects a,syscolumns b
set rowcount 0

update # set [time]=dateadd(day,id,[time])
select [time] from #
drop table #
paoluo 2007-08-15
  • 打赏
  • 举报
回复
這種時間跨度很大的情況下,使用循環的效率很低。
paoluo 2007-08-15
  • 打赏
  • 举报
回复

Declare @起始日期 DateTime, @结束日期 DateTime
Select @起始日期 = '20060101', @结束日期 = '20080910'

Select TOP 2000 ID = Identity(Int, 0, 1) Into #T From SYsColumns A, SysColumns B

Select
Convert(Varchar, DateAdd(dd, ID, @起始日期), 112) As 日期
From
#T
Where ID <= DateDiff(dd, @起始日期, @结束日期)

Drop Table #T
--Result
/*
日期
20060101
20060102
20060103
20060104
20060105
...
20080907
20080908
20080909
20080910
*/
paoluo 2007-08-15
  • 打赏
  • 举报
回复
借用臨時表


Declare @起始日期 DateTime, @结束日期 DateTime
Select @起始日期 = '20060101', @结束日期 = '20080910'

Select TOP 2000 ID = Identity(Int, 0, 1) Into #T From SYsColumns A, SysColumns B

Select
Convert(Varchar, DateAdd(dd, ID, @起始日期), 112) As 日期
From
#T
Where ID <= DateDiff(dd, @起始日期, @结束日期)

Drop Table #T
dawugui 2007-08-15
  • 打赏
  • 举报
回复
用循环写.

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧