`

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

 

分享到:
评论

相关推荐

    SQLserver中按年月日生成日期型自增编码.pdf

    SQL Server 中按年月日生成日期型自增编码 本文档介绍了在 SQL Server 中生成日期型自增编码的方法,通过创建两个函数 `GenCustomCode` 和 `GenCustomID`,可以生成按年月日的日期型自增编码。该方法可以应用于各种...

    根据年月日生成编号sqlserver 很不错的算法

    标题提到的"根据年月日生成编号sqlserver 很不错的算法"可能是一种高效且灵活的方法,用于创建包含日期元素的唯一标识符。以下将详细介绍这种算法的可能实现及其原理。 首先,我们可以考虑使用SQL Server的内置函数...

    sql server日期格式转换方法大全

    例如,获取日期字段的年份: ```sql SELECT DATEPART(year, myDate) AS 'Year' FROM myTable; ``` 要增加一年: ```sql SELECT DATEADD(year, 1, myDate) AS 'NextYear' FROM myTable; ``` 4. `DATENAME()...

    sql server提取日期的部分

    在SQL Server中,处理日期和时间是常见的任务,特别是在数据分析和报表生成中。提取日期的特定部分可以帮助我们更好地理解和组织数据。本文将详细介绍如何使用`DATEPART`和`DATENAME`这两个函数来提取日期的不同部分...

    sqlserver 计算当月所有自然周的区间。

    - `DATEPART()`:返回指定日期的特定部分(如年份、月份、日等)。 - `CONVERT()`:将一个表达式转换为另一个数据类型,这里用来转换日期格式。 ### 3. 创建存储自然周信息的表 在给出的代码片段中,首先创建了一...

    Sql Server 中一个非常强大的日期格式化函数

    `CONVERT()`函数是SQL Server中处理日期时间格式化的强大工具,通过灵活设置`style`参数,可以满足几乎所有关于日期时间格式的需求。掌握这一技能,不仅能提升SQL查询的效率和灵活性,还能优化数据的呈现效果,提高...

    SQL SERVER 日期格式化输出.txt

    - `style`: 可选参数,用于指定日期时间的格式样式。 #### 三、日期格式化样式的详细介绍 在给定的文件内容中,展示了使用不同`style`参数值时`CONVERT`函数的输出结果。下面对这些样式进行详细解释: ##### 1. ...

    SQL Server-DatePart函数

    举例来说,如果你有一个名为`OrderDate`的日期字段,你可以用以下方式提取年份: ```sql SELECT DATEPART(year, OrderDate) AS 'OrderYear' FROM Orders; ``` 这将返回`Orders`表中每条订单的年份。 `DATEPART`...

    SqlServer转换Oracle.docx

    本文将围绕《SqlServer转换Oracle.docx》文档中的关键知识点进行详细解析,帮助读者更好地理解和掌握SQL Server到Oracle迁移过程中的技术要点。 #### 二、连接字符串与数据源处理 在文档中提到了一种获取连接字符串...

    SQLServer2000 库函数

    在SQL Server 2000中,库函数是数据库管理系统提供的一系列内置函数,用于处理各种数据类型和执行特定操作。这些函数极大地丰富了SQL语言的功能,使得开发人员和DBA能够更高效地管理和操作数据库。下面将详细介绍SQL...

    sqlserver2000 sample databases

    SQL Server 2000是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理领域有着广泛的应用。本资源包含的是SQL Server 2000的两个示例数据库源码,分别是Northwind和Pubs,这两个数据库经常被用于教学、...

    数据仓库日期维度表创建存储过程

    - 初始化数据:生成初始的日期范围,通常从远古时期到预计未来一段时间,以确保覆盖所有可能的查询需求。 - 填充属性:根据日期计算并填充各个属性,如年份、月份、星期等。 - 维护索引:为了提高查询性能,可能需要...

    SQL行转列参考代码(sqlserver)

    例如,如果我们不知道具体有多少个年份,可以先获取所有年份,然后构建Pivot的SQL语句: ```sql DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N', p.' + QUOTENAME(Year) FROM (SELECT DISTINCT Year FROM ...

    sqlserver数据库常用函数

    3. **DATENAME**: 该函数返回指定日期部分的名称,如月份名或星期名。例如,`DATENAME(month, '2022-01-01')` 返回 "January"。 4. **DATEPART**: 这个函数返回日期中的特定部分,如年份、月份、日期等。例如,`...

    Visual Basic 函数与SQl server函数

    它提供了丰富的内置函数来简化编程任务,而SQL Server作为流行的数据库管理系统,也有自己的函数集用于数据处理和查询。本文将详细介绍Visual Basic和SQL Server中的主要函数类别。 **Visual Basic 函数** 1. **...

    sql server 2000常用函数大全

    在SQL Server 2000中,函数被广泛应用于各种数据库操作,包括数值计算、字符串处理、日期时间操作、类型转换等。下面我们将详细探讨SQL Server 2000中的一些常用函数。 1. **数值函数**: - `ABS()`: 返回一个数的...

    SQL Server基本函数详细介绍.doc

    ### SQL Server 基本函数详解 #### 一、字符串函数 在 SQL Server 中,字符串函数主要用于处理文本数据,包括但不限于长度分析、字符操作、字符串查找等。 ##### 1. 长度与分析用 - **datalength(Char_expr)**:...

    sqlserver日期函数.pdf

    在SQL Server中,日期函数是处理日期和时间数据的关键工具,它们可以帮助我们进行各种日期相关的计算和转换。本文主要介绍了SQL Server中的一些常见日期函数,包括`DATENAME`、`DATEPART`、`DATEADD`、`DATEDIFF`、`...

    sqlserver日期函数[参照].pdf

    SQL Server中的日期函数是数据库操作中非常常用的功能,它们用于处理和操纵日期和时间数据。在SQL Server中,有多种日期函数可以帮助我们提取、转换和计算日期和时间。以下是基于提供的内容对这些函数的详细解释: ...

Global site tag (gtag.js) - Google Analytics