-
create function fn_Calendar(@year int, @month int)
returns nvarchar(max)
as
begin
declare @result nvarchar(max), @Enter nvarchar(8)
select @Enter = char(13)+char(10), @result = \' Sun Mon The Wed Thu Fri Sta\' + @Enter --表头
declare @start datetime, @end datetime
select @start = rtrim(@year)+\'-\'+rtrim(@month)+\'-1\', @end = dateadd(mm, 1, @start)
set @result = @result+replicate(\' \', (datepart(dw, @start)+@@datefirst+6)%7) --第一行前面的空格
while datediff(d, @start, @end)>0
begin
if (datepart(dw, @start)+@@datefirst)%7 = 1
select @result = @result+@Enter --是否换行
select @result = @result+right(\' \'+rtrim(day(@start)), 4), @start = dateadd(d, 1, @start)
end
return @result
end
go
set datefirst 3
print dbo.fn_Calendar(2007, 12)
select dbo.fn_Calendar(2007, 12)
set datefirst 7
drop function dbo.fn_Calendar
/*
Sun Mon The Wed Thu Fri Sta
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
------------------------------------------
Sun Mon The Wed Thu Fri Sta
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
(1 row(s) affected)
*/
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create function F_month(@YMonth nvarchar(6))
returns @T table(日 varchar(4),一 varchar(4),二 varchar(4),三 varchar(4),四 varchar(4),五 varchar(4),六 varchar(4))
as
begin
declare @Tmp table([weekday] int,[day] nvarchar(2),[group] int)---增加一列作为分组显示
declare @i int,@j int,@date datetime,@group int
select @date=@YMonth+\'01\',@i=datediff(dd,@date,dateadd(month,1,@date)),@j=0,@group=0
while @i>@j
begin
insert @Tmp select (datepart(dw,@date)+@@datefirst-1)%7,datepart(d,@date),case when (datepart(dw,@date)+@@datefirst-1)%7=0 then @group+1 else @group end
select @j=@j+1,@group=case when (datepart(dw,@date)+@@datefirst-1)%7=0 then @group+1 else @group end,@date=dateadd(dd,1,@date)
end
insert @T
select
max(case when [weekday]=0 then [day] else \'\' end),
max(case when [weekday]=1 then [day] else \'\' end),
max(case when [weekday]=2 then [day] else \'\' end),
max(case when [weekday]=3 then [day] else \'\' end),
max(case when [weekday]=4 then [day] else \'\' end),
max(case when [weekday]=5 then [day] else \'\' end),
max(case when [weekday]=6 then [day] else \'\' end)
from
@Tmp
group by [group]
return
end
go
select * from F_month(\'0712\')
或:
select * from F_month(\'200712\')
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
数据库应该创建一个日历表
CREATE TABLE Calendar(
date datetime NOT NULL PRIMARY KEY CLUSTERED,
weeknum int NOT NULL,
weekday int NOT NULL,
weekday_desc nchar(3) NOT NULL,
is_workday bit NOT NULL,
is_weekend bit NOT NULL
)
GO
WITH CTE1 AS(
SELECT
date = DATEADD(day,n,'19991231')
FROM Nums
WHERE n <= DATEDIFF(day,'19991231','20201231')),
CTE2 AS(
SELECT
date,
weeknum = DATEPART(week,date),
weekday = (DATEPART(weekday,date) + @@DATEFIRST - 1) % 7,
weekday_desc = DATENAME(weekday,date)
FROM CTE1)
--INSERT INTO Calendar
SELECT
date,
weeknum,
weekday,
weekday_desc,
is_workday = CASE WHEN weekday IN (0,6) THEN 0 ELSE 1 END,
is_weekend = CASE WHEN weekday IN (0,6) THEN 1 ELSE 0 END
FROM CTE2
编辑推荐:
- 整理了SQL Server中是实现日历的几个方法03-02
- usb3.0和usb3.1的区别03-02
- SQL2005错误4064解决方法03-02
- 安装SQLServerManagementStudio容易遇到的问题03-02
- SQLServer数据库备份和还原的学习03-02
- Windows7/8安装SQLServer2005报错的解决方法03-02
- 酷睿i3和i5的区别是什么03-02
- 电脑虚拟内存怎么设置最好03-02
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- usb3.0和usb3.1的区别
usb3.0和usb3.1的区别
26-03-02 - SQLServer数据库备份和还原的学习
SQLServer数据库备份和还原的学习
26-03-02 - Windows7/8安装SQLServer2005报错的解决方法
Windows7/8安装SQLServer2005报错的解决方法
26-03-02 - 电脑虚拟内存怎么设置最好
电脑虚拟内存怎么设置最好
26-03-02 - 电脑中的注销和关机、待机和休眠有什么区别?
电脑中的注销和关机、待机和休眠有什么区别?
26-03-02 - 如何利用iPad做电脑第二显示屏
如何利用iPad做电脑第二显示屏
26-03-02 - 电脑开机密码怎么取消
电脑开机密码怎么取消
26-03-02 - 电脑字体怎么安装到电脑
电脑字体怎么安装到电脑
26-03-02 - 鼠标灵敏度怎么调
鼠标灵敏度怎么调
26-03-02 - 基于MicrosoftSQLServer2005安装Teamcenter8.3
