`

SQL Server:生成指定年份的所有日期

阅读更多

测试所用的表:table24

 

结构及意义:

field1:主键序号

field2:日期

field3:当前日期是本年度的第几周(用来查询)

field4:星期几(如星期一)

field5:年份

 

建表SQL:

CREATE TABLE [dbo].[table24](
	[field1] [int] IDENTITY(1,1) NOT NULL,
	[field2] [datetime] NULL,
	[field3] [int] NULL,
	[field4] [varchar](10) COLLATE Chinese_PRC_CI_AS NULL,
	[field5] [int] NULL,
 CONSTRAINT [PK_table24] PRIMARY KEY CLUSTERED 
(
	[field1] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键-序号' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table24', @level2type=N'COLUMN', @level2name=N'field1'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table24', @level2type=N'COLUMN', @level2name=N'field2'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'当前是本年的第几周' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table24', @level2type=N'COLUMN', @level2name=N'field3'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'星期几' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table24', @level2type=N'COLUMN', @level2name=N'field4'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'年份' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'table24', @level2type=N'COLUMN', @level2name=N'field5'

 

生成指定年份的所有日期:

--测试: 
--测试默认值:exec getDateOfThisYear 0,0 ;
--测试指定年份(补充以前的数据,不生成周末的数据):exec getDateOfThisYear 2017,1,0;
--测试指定年份(不补充以前的数据,不生成周末的数据):exec getDateOfThisYear 2017,0,0;
--测试指定年份(不补充以前的数据,生成周末的数据):exec getDateOfThisYear 2017,0,1;
--测试指定年份(不补充以前的数据,不生成周末的数据):exec getDateOfThisYear 2017,0,0;
--查看数据:select * from table24;
ALTER PROCEDURE [dbo].[getDateOfThisYear]	
	@cur_year int, --当前年份
	@flag int, --是否补充以前的数据,1-补充,将当前系统中最晚时间以前的数据补充上去 0-不补充,直接从最晚时间开始,默认为不补充直接从系统最晚时间开始
	@flag2 int --是否生成周六周日的数据,1-生成周六日的数据 0-不生成,默认不生成
AS
BEGIN	
	SET NOCOUNT ON;
	if(@cur_year is null or @cur_year<=0)
	begin
		set @cur_year = year(getDate());--赋值为当前年份
	end
	
	if(@flag is null or @flag<0)
	begin
		set @flag = 0;--不补充,从系统最晚时间开始
	end
	
	if(@flag2 is null or @flag2<0)
	begin
		set @flag2 = 0;--不生成周末时间
	end

	--开始时间	
	declare @startTime varchar(10);
	if(@flag=0)
	begin
		--获取系统中今年最大的时间
		select top 1 @startTime = dateadd(day,1,field2) from table24 where year(field2)=@cur_year order by field2 desc;--降序取第一条,并且计算出开始的时间		
		if(@startTime is null)--没有数据,取本周第一天,即周一
		begin
			set @startTime = dateadd(wk, datediff(wk,0,getdate()), 0);			
		end
	end
	else
	begin--补充以前的,那么从1月1号开始
		set @startTime = cast(@cur_year as varchar(20))+'0101';--形如20170101
	end
	
	--结束时间
	declare @endTime varchar(10);
	set @endTime = cast((@cur_year+1) as varchar(20))+'0101';--形如20180101

	--生成当前年份的数据
	if(@flag2=1)--生成周六日的时间
	begin
		insert into table24(field2,field5)
		select distinct dateadd(day,number,@startTime),@cur_year 
		from master..spt_values 
		where number>=0 and number<=365
		and dateadd(day,number,@startTime) <@endTime
		and dateadd(day,number,@startTime)  not in (select field2 from table24)--不允许重复
	end
	else--不生成
	begin
		insert into table24(field2,field5)
		select distinct dateadd(day,number,@startTime),@cur_year 
		from master..spt_values 
		where number>=0 and number<=365
		and dateadd(day,number,@startTime) <@endTime
		and datepart(dw,dateadd(day,number,@startTime)) not in (1,7)--not in (1,7):不生成周六日的数据
		and dateadd(day,number,@startTime)  not in (select field2 from table24)--不允许重复
	end
	--更新今年每个日期是是第几周,是星期几
	update table24 set field3=datepart(week,field2),field4=datename(dw,field2) where field5=@cur_year;

	--更新以前的数据
	--update table24 set field3=datepart(week,field2),field4=datename(dw,field2),field5=year(field2) where field4 is null or field5 is null;
END
--select datepart(weekday,getdate()) as '周内的第几日'
--select datepart(week,getdate()) as '年内的第几周'
--select datepart(quarter,getdate()) as 年内的第几季'
--select datename(dw,getdate()) as '当前是星期几' --可返回汉字形式的星期
--select datepart(dw,'20170909') as '当前是星期几' --可返回数字形式的星期(1-星期日 2-星期一 3-星期二 以此类推)
/*--生成一年的数据
insert tb
 select distinct dateadd(day,number,'20130101') 
 from master..spt_values 
 where number>=0 and number<=365
 and dateadd(day,number,'20130101') <'20140101'
 and dateadd(day,number,'20130101')  not in (select date from tb)
*/

 

生成本周的所有日期:

--测试: exec getDateOfWeek;
CREATE PROCEDURE [dbo].[getDateOfWeek]	
AS
BEGIN	
	SET NOCOUNT ON;
	/*	
	--获取当前周的第一天,也就是这周的周一是哪天
	declare @mon datetime;
	select @mon = dateadd(wk, datediff(wk,0,getdate()), 0);
	*/
	--获取当前周是第几周
	declare @weekes int;
	select @weekes = dbo.WeekOfMonth(getDate());
	
	--循环添加数据
	declare @count int;
	declare @c int;
	set @count = 6;
	set @c = 0;
	while(@c<=@count)
	begin
		insert into table24(field2,field5)
		select dateadd(wk, datediff(wk,0,getdate()), @c),year(getDate());
		set @c = @c +1;
	end

	update table24 set field3=datepart(week,field2),field4=datename(dw,field2) where field5=year(getDate());
END

 

分享到:
评论

相关推荐

    sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期。 而自带的系统表master..spt_values存在一定的局限性,...

    c# 按日期+序号进行自动编号

    在网上搜了半天,都没有看到满意的程序。只好参照别人写的例子,自己写了。编号是按照年份和月份+三位序号自动生成的,用的是SQL server数据库,用VS2010编写的。调试已通过。希望给同为新手的各位一个参考。

    基于delphi和sqlserver数据库的物料管理系统含详细报告数据库及脚本

    3. 打印仓库账本程序,给定年份和物料,打印物料代码、名称、规格、计量单位、各日期的进仓、出仓和库存量。 资源包含: 1.系统源码 2.数据库及脚本 3.部分1详细说明报告 4.部分2详细说明报告 5.部分3详细说明报告...

    SQL语法大全

    Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。 ActiveConnection Recordset对象可以通过...

    SQL函数

    SQL SERVER 的函数 1.字符串函数 长度与分析用 datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 substring(expression,start,length) 不多说了,取子串 right(char_expr,int_expr...

    MyFll Microsoft Visual FoxPro设计的扩展库

    GetSqlServer 列出所有网络上的SQL Server IpToMAC 根据IP得到MAC地址 邮件函数: SmtpCreate 创建一个SMTP发送邮件的句柄 SmtpNewMail 在内存中创建邮件内容,等待发送 SmtpSend 发送邮件 ...

    成绩管理系统(普教版) v20140630.rar

    sqlserver数据库支持需要请留言:【本地留言】 四、友情提醒 推荐通过火狐浏览器(FireFox)使用该系统,体验效果更佳。 五、软件简介 【普教版】高博成绩管理系统是一套面向学前、小学、初中、高中不同学制不同年...

    印染厂生产仓储信息系统

    数据库系统:sqlserver 2005 JAVA平台:JDK1.5 J2EE1.4 WEB服务器: Tomcat 6.0 客户端操作系统: WINDOWS2000、WINDOWS XP 客户端浏览器:IE7.0或以上版本  2)系统开发工具 Eclipse 3.3+MyEclipse 6.5 + Tomcat...

    XCoder:新生命码神工具,代码生成、网络工具、API工具、串口工具、正则工具、图标工具、加解密工具、地图接口

    新生命开源项目矩阵各项目默认支持net4.5/net4.0/netstandard2.0项目年份状态.NET Core说明基础组件支撑其它中间件以及产品项目2002维护中√算法、日志、网络、RPC、序列化、缓存、多线程2005维护中√数据中间件,...

    asp.net专家疑难解答200问源码

    163.如何获取SQL Server服务器端所有数据库列表 164.如何保存图片文件到SQL Server数据库 165.如何将数据库中保存的图片显示到页面中 166.如何在插入记录后获得记录的标识号 167.如何解决ADO.NET访问ACCESS...

    成绩管理系统(普教版)源码v20140630

    sqlserver数据库支持需要请留言:【本地留言】 四、友情提醒 推荐通过火狐浏览器(FireFox)使用该系统,体验效果更佳。 五、软件简介 【普教版】高博成绩管理系统是一套面向学前、小学、初中、高中不同学制不同年...

    C#编程经验技巧宝典

    83 &lt;br&gt;0125 按要求生成指定位数编号 83 &lt;br&gt;0126 确定两字符串是否相等 84 &lt;br&gt;0127 判断两字符串中指定子串是否相等 84 &lt;br&gt;0128 判断字符串是否为日期格式 85 &lt;br&gt;0129 清除字符串中指定...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例063 使用DateAdd方法向指定日期添加 一段时间间隔 78 实例064 使用TimeSpan对象获取时间间隔 80 实例065 使用Sleep方法延迟时间 81 实例066 如何确定程序的运行时间 82 实例067 使用ParseExact方法将字符串转化...

    java源码包2

    显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法: ...

    asp.net专家疑难解答200问

    如何获取SQL Server服务器端所有数据库列表 164.如何保存图片文件到SQL Server数据库 165.如何将数据库中保存的图片显示到页面中 166.如何在插入记录后获得记录的标识号 167.如何解决ADO.NET访问...

    oracle数据库经典题目

    PL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的,语句块之间可以相互嵌套,每个语句块完成特定的功能。  声明部分:以关键字DECLARE开始,BEGIN结束。主要用于声明变量、常量、数据类型、游标...

    java jdk实列宝典 光盘源代码

    日历:使用swing和awt实现一个图形化的日历可以查询星期、日期和年份信息(CalenderTrain.java);标准计算器(Callulator.java);更改组建外观,对日历设置几个显示外观(lookandfeel.java);自定义对话框Dialog...

Global site tag (gtag.js) - Google Analytics