导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

求救呀。。在线等..

99_mei 2003-12-09 08:54:22
有什么函数能列出一年中的所有星期六,日的呀。。
我要设计一个日历呀。。就是能批量增加一年或几年的休息日,如星期六,日。国庆,五一等.
...全文
4 点赞 收藏 20
写回复
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
realgz 2003-12-12
--早说吗 白拿你分了。
declare @d table (序号 int,日期 datetime,星期 varchar(10) )
declare @x datetime
declare @cnt datetime
set @x='2003-01-01'
set @cnt=dateadd(year,1,@x)
while @cnt>@x
begin
if datepart(weekday,@x) in (1,7)
insert into @d (序号 ,日期,星期 )
select convert(int,@x-dateadd(year,-1,@cnt)) as 序号,@x as 日期 ,
case when datepart(weekday,@x)=1 then '星期天' else '星期六' end as 星期
set @x=@x+1
end
select * from @d
回复
99_mei 2003-12-10
你这个结果显示是分开的呀如下:。我要的是没有分开的
1 2003-01-04 00:00:00.000 星期六
-----------------------------------------------------------------------------
2 2003-01-05 00:00:00.000 星期日
------------------------------------------------------------------------------
3 2003-01-11 00:00:00.000 星期六
-----------------------------------------------------------------------------
4 2003-01-12 00:00:00.000 星期日
---------------------------------------------------------------------------
5 2003-01-18 00:00:00.000 星期六
。。。。。。。。
回复
realgz 2003-12-10
--无聊 再来个改进
declare @x datetime
declare @cnt datetime
set @x='2003-01-01'
set @cnt=dateadd(year,1,@x)
while @cnt>@x
begin
if datepart(weekday,@x) in (1,7)
select convert(int,@x-dateadd(year,-1,@cnt)) as 序号,@x as 日期 ,
case when datepart(weekday,@x)=1 then '星期天' else '星期六' end as 星期
set @x=@x+1
end
--可惜不知道access怎么做
回复
ACCESS数据库是没有

ACCESS数据库得前台或调用VBA处理,我上面给了一个例子
回复
99_mei 2003-12-10
数据库没有这个表: sysobjects
回复
ACCESS中不能这样处理,你可以写一个通用模块来处理嘛.类似:

Sub s_dtlist(ByVal dt1 As Date, ByVal dt2 As Date)
Dim dt As Date
For dt = dt1 To dt2
If DatePart("w", dt, vbMonday) = 6 Or DatePart("w", dt, vbMonday) = 7 Then
Debug.Print dt & vbTab & "星期" & Mid("六日", DatePart("w", dt, vbMonday) - 5, 1)
End If
Next
End Sub


回复
CrazyFor 2003-12-10
ACCESS就到前台去做了.
回复
99_mei 2003-12-10
to realgz(realgz)
你的几好呀。。如果能这样显示就好啦。
1 2003-01-04 00:00:00.000 星期六
2 2003-01-05 00:00:00.000 星期日
3 2003-01-11 00:00:00.000 星期六
4 2003-01-12 00:00:00.000 星期日
5 2003-01-18 00:00:00.000 星期六
6 2003-01-19 00:00:00.000 星期日
7 2003-01-25 00:00:00.000 星期六
8 2003-01-26 00:00:00.000 星期日
回复
realgz 2003-12-10
ACCESS数据库啊?没用过,自己找函数吗。
回复
--这个函数就是啦
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdt]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_getdt]
GO

create function f_getdt(
@year int --要查询的年份
)returns @re table(id int identity(1,1),日期 datetime,星期 varchar(10))
as
begin
declare @tb table(id int identity(0,1),日期 datetime)
insert into @tb(日期) select top 366 null from sysobjects a ,sysobjects b
update @tb set 日期=dateadd(day,id,dateadd(year,@year-1900,'1900-1-1'))
insert into @re(日期,星期)
select 日期,datename(weekday,日期)
from @tb where datepart(weekday,日期) in (1,7)
return
end
go

--调用示例,得到2003年的.
select * from dbo.f_getdt(2003)

--得到2003年指定时间段的
select * from dbo.f_getdt(2003) where 日期 between '2003-01-01' and '2003-01-31'

/*--结果(第一个太长,只贴出了第二个):
id 日期 星期
----------- ------------------------------------------------------ ----------
1 2003-01-04 00:00:00.000 星期六
2 2003-01-05 00:00:00.000 星期日
3 2003-01-11 00:00:00.000 星期六
4 2003-01-12 00:00:00.000 星期日
5 2003-01-18 00:00:00.000 星期六
6 2003-01-19 00:00:00.000 星期日
7 2003-01-25 00:00:00.000 星期六
8 2003-01-26 00:00:00.000 星期日

(所影响的行数为 8 行)
--*/
回复
realgz 2003-12-10
declare @x datetime
declare @cnt datetime
set @x='2003-01-01'
set @cnt=dateadd(year,1,@x)
while @cnt>@x
begin
if datepart(weekday,@x) in (1,7)
select @x
set @x=@x+1
end
回复
99_mei 2003-12-10
我的是ACCESS数据库呀。。
回复
txlicenhe 2003-12-10
所有的SQL数据库都有这个: master..sysobjects

回复
99_mei 2003-12-10
to pengdali(大力 V3.0)
我的数据库没有这个呀master..sysobjects!
那应该怎解决!…
回复
devilwind 2003-12-09
这是我的:
alter proc day_get
--获取每年的周末
@year varchar(10)
as
if object_id('tempdb..#tmp') is not null
drop table #tmp
create table #tmp(dat char(10))

declare @alldate varchar(20),@i int,@j int
select @alldate=@year+'0101'
select @j=datepart(dayofyear,@alldate)
select @i=datepart(weekday,@alldate)
while @j<datepart(dayofyear,dateadd(day,-1,cast((cast(@year as int)+1) as varchar(10))+'0101') )
begin
if @i in(1,7)
insert #tmp select convert(char(10),cast(@alldate as datetime),120)

select @alldate=dateadd(day,1,@alldate)
select @j=datepart(dayofyear,@alldate)

select @i=datepart(weekday,@alldate)
end
select dat,case datepart(weekday,dat) when 7 then '星期6' when 1 then '星期天' end from #tmp


测试
day_get '2003'

2003-01-04 星期6
2003-01-05 星期天
2003-01-11 星期6
2003-01-12 星期天
2003-01-18 星期6
2003-01-19 星期天
2003-01-25 星期6
2003-01-26 星期天
2003-02-01 星期6
2003-02-02 星期天
2003-02-08 星期6
2003-02-09 星期天
2003-02-15 星期6
2003-02-16 星期天
2003-02-22 星期6
2003-02-23 星期天
2003-03-01 星期6
2003-03-02 星期天
2003-03-08 星期6
2003-03-09 星期天
2003-03-15 星期6
2003-03-16 星期天
2003-03-22 星期6
2003-03-23 星期天
2003-03-29 星期6
2003-03-30 星期天
2003-04-05 星期6
2003-04-06 星期天
2003-04-12 星期6
2003-04-13 星期天
2003-04-19 星期6
2003-04-20 星期天
2003-04-26 星期6
2003-04-27 星期天
2003-05-03 星期6
2003-05-04 星期天
2003-05-10 星期6
2003-05-11 星期天
2003-05-17 星期6
2003-05-18 星期天
2003-05-24 星期6
2003-05-25 星期天
2003-05-31 星期6
2003-06-01 星期天
2003-06-07 星期6
2003-06-08 星期天
2003-06-14 星期6
2003-06-15 星期天
2003-06-21 星期6
2003-06-22 星期天
2003-06-28 星期6
2003-06-29 星期天
2003-07-05 星期6
2003-07-06 星期天
2003-07-12 星期6
2003-07-13 星期天
2003-07-19 星期6
2003-07-20 星期天
2003-07-26 星期6
2003-07-27 星期天
2003-08-02 星期6
2003-08-03 星期天
2003-08-09 星期6
2003-08-10 星期天
2003-08-16 星期6
2003-08-17 星期天
2003-08-23 星期6
2003-08-24 星期天
2003-08-30 星期6
2003-08-31 星期天
2003-09-06 星期6
2003-09-07 星期天
2003-09-13 星期6
2003-09-14 星期天
2003-09-20 星期6
2003-09-21 星期天
2003-09-27 星期6
2003-09-28 星期天
2003-10-04 星期6
2003-10-05 星期天
2003-10-11 星期6
2003-10-12 星期天
2003-10-18 星期6
2003-10-19 星期天
2003-10-25 星期6
2003-10-26 星期天
2003-11-01 星期6
2003-11-02 星期天
2003-11-08 星期6
2003-11-09 星期天
2003-11-15 星期6
2003-11-16 星期天
2003-11-22 星期6
2003-11-23 星期天
2003-11-29 星期6
2003-11-30 星期天
2003-12-06 星期6
2003-12-07 星期天
2003-12-13 星期6
2003-12-14 星期天
2003-12-20 星期6
2003-12-21 星期天
2003-12-27 星期6
2003-12-28 星期天
回复
pengdali 2003-12-09
结果包括5.1:

时间 星期
------------------------------------------------------ ------------------------------
2003-01-04 00:00:00.000 星期六
2003-01-05 00:00:00.000 星期日
2003-01-11 00:00:00.000 星期六
2003-01-12 00:00:00.000 星期日
2003-01-18 00:00:00.000 星期六
2003-01-19 00:00:00.000 星期日
2003-01-25 00:00:00.000 星期六
2003-01-26 00:00:00.000 星期日
2003-02-01 00:00:00.000 星期六
2003-02-02 00:00:00.000 星期日
2003-02-08 00:00:00.000 星期六
2003-02-09 00:00:00.000 星期日
2003-02-15 00:00:00.000 星期六
2003-02-16 00:00:00.000 星期日
2003-02-22 00:00:00.000 星期六
2003-02-23 00:00:00.000 星期日
2003-03-01 00:00:00.000 星期六
2003-03-02 00:00:00.000 星期日
2003-03-08 00:00:00.000 星期六
2003-03-09 00:00:00.000 星期日
2003-03-15 00:00:00.000 星期六
2003-03-16 00:00:00.000 星期日
2003-03-22 00:00:00.000 星期六
2003-03-23 00:00:00.000 星期日
2003-03-29 00:00:00.000 星期六
2003-03-30 00:00:00.000 星期日
2003-04-05 00:00:00.000 星期六
2003-04-06 00:00:00.000 星期日
2003-04-12 00:00:00.000 星期六
2003-04-13 00:00:00.000 星期日
2003-04-19 00:00:00.000 星期六
2003-04-20 00:00:00.000 星期日
2003-04-26 00:00:00.000 星期六
2003-04-27 00:00:00.000 星期日
2003-05-01 00:00:00.000 星期四
2003-05-03 00:00:00.000 星期六
2003-05-04 00:00:00.000 星期日
2003-05-10 00:00:00.000 星期六
2003-05-11 00:00:00.000 星期日
2003-05-17 00:00:00.000 星期六
2003-05-18 00:00:00.000 星期日
2003-05-24 00:00:00.000 星期六
2003-05-25 00:00:00.000 星期日
2003-05-31 00:00:00.000 星期六
2003-06-01 00:00:00.000 星期日
2003-06-07 00:00:00.000 星期六
2003-06-08 00:00:00.000 星期日
2003-06-14 00:00:00.000 星期六
2003-06-15 00:00:00.000 星期日
2003-06-21 00:00:00.000 星期六
2003-06-22 00:00:00.000 星期日
2003-06-28 00:00:00.000 星期六
2003-06-29 00:00:00.000 星期日
2003-07-05 00:00:00.000 星期六
2003-07-06 00:00:00.000 星期日
2003-07-12 00:00:00.000 星期六
2003-07-13 00:00:00.000 星期日
2003-07-19 00:00:00.000 星期六
2003-07-20 00:00:00.000 星期日
2003-07-26 00:00:00.000 星期六
2003-07-27 00:00:00.000 星期日
2003-08-02 00:00:00.000 星期六
2003-08-03 00:00:00.000 星期日
2003-08-09 00:00:00.000 星期六
2003-08-10 00:00:00.000 星期日
2003-08-16 00:00:00.000 星期六
2003-08-17 00:00:00.000 星期日
2003-08-23 00:00:00.000 星期六
2003-08-24 00:00:00.000 星期日
2003-08-30 00:00:00.000 星期六
2003-08-31 00:00:00.000 星期日
2003-09-06 00:00:00.000 星期六
2003-09-07 00:00:00.000 星期日
2003-09-13 00:00:00.000 星期六
2003-09-14 00:00:00.000 星期日
2003-09-20 00:00:00.000 星期六
2003-09-21 00:00:00.000 星期日
2003-09-27 00:00:00.000 星期六
2003-09-28 00:00:00.000 星期日
2003-10-01 00:00:00.000 星期三
2003-10-04 00:00:00.000 星期六
2003-10-05 00:00:00.000 星期日
2003-10-11 00:00:00.000 星期六
2003-10-12 00:00:00.000 星期日
2003-10-18 00:00:00.000 星期六
2003-10-19 00:00:00.000 星期日
2003-10-25 00:00:00.000 星期六
2003-10-26 00:00:00.000 星期日
2003-11-01 00:00:00.000 星期六
2003-11-02 00:00:00.000 星期日
2003-11-08 00:00:00.000 星期六
2003-11-09 00:00:00.000 星期日
2003-11-15 00:00:00.000 星期六
2003-11-16 00:00:00.000 星期日
2003-11-22 00:00:00.000 星期六
2003-11-23 00:00:00.000 星期日
2003-11-29 00:00:00.000 星期六
2003-11-30 00:00:00.000 星期日
2003-12-06 00:00:00.000 星期六
2003-12-07 00:00:00.000 星期日
2003-12-13 00:00:00.000 星期六
2003-12-14 00:00:00.000 星期日
2003-12-20 00:00:00.000 星期六
2003-12-21 00:00:00.000 星期日
2003-12-27 00:00:00.000 星期六
2003-12-28 00:00:00.000 星期日

(所影响的行数为 106 行)
回复
pengdali 2003-12-09
declare @年 datetime
set @年='2003-1-1'


select dateadd(day,id,@年) 时间,DATENAME(weekday,dateadd(day,id,@年)) 星期 from (
select top 366 (select sum(1) from sysobjects where id<=a.id) id from master..sysobjects a) tem
where datediff(year,@年,dateadd(day,id,@年))=0 and
(datepart(weekday,dateadd(day,id,@年)) in (1,7) or dateadd(day,id,@年) in

('2003-5-1','2003-10-1'))--这里添加
回复
至于休息日,因为没有规律,只能手工添加上去了.
回复
pengdali 2003-12-09
declare @年 datetime
set @年='2003-1-1'


select dateadd(day,id,@年) from (
select top 366 (select sum(1) from sysobjects where id<=a.id) id from master..sysobjects a) tem
where datediff(year,@年,dateadd(day,id,@年))=0 and
(datepart(weekday,dateadd(day,id,@年)) in (1,7) or dateadd(day,id,@年) in

('2003-5-1','2003-10-1'))--这里添加
回复
create function f_getdt(
@year int --要查询的年份
)returns @re table(id int identity(1,1),日期 datetime,星期 varchar(10))
as
begin
declare @tb table(id int identity(0,1),日期 datetime)
insert into @tb(日期) select top 366 null from sysobjects a ,sysobjects b
update @tb set 日期=dateadd(day,id,dateadd(year,@year-1900,'1900-1-1'))
insert into @re(日期,星期)
select 日期,datename(weekday,日期)
from @tb where datepart(weekday,日期) in (1,7)
return
end
go

--调用示例
select * from dbo.f_getdt(2003)
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告