测试所用的表: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 中按年月日生成日期型自增编码 本文档介绍了在 SQL Server 中生成日期型自增编码的方法,通过创建两个函数 `GenCustomCode` 和 `GenCustomID`,可以生成按年月日的日期型自增编码。该方法可以应用于各种...
标题提到的"根据年月日生成编号sqlserver 很不错的算法"可能是一种高效且灵活的方法,用于创建包含日期元素的唯一标识符。以下将详细介绍这种算法的可能实现及其原理。 首先,我们可以考虑使用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中,处理日期和时间是常见的任务,特别是在数据分析和报表生成中。提取日期的特定部分可以帮助我们更好地理解和组织数据。本文将详细介绍如何使用`DATEPART`和`DATENAME`这两个函数来提取日期的不同部分...
- `DATEPART()`:返回指定日期的特定部分(如年份、月份、日等)。 - `CONVERT()`:将一个表达式转换为另一个数据类型,这里用来转换日期格式。 ### 3. 创建存储自然周信息的表 在给出的代码片段中,首先创建了一...
`CONVERT()`函数是SQL Server中处理日期时间格式化的强大工具,通过灵活设置`style`参数,可以满足几乎所有关于日期时间格式的需求。掌握这一技能,不仅能提升SQL查询的效率和灵活性,还能优化数据的呈现效果,提高...
- `style`: 可选参数,用于指定日期时间的格式样式。 #### 三、日期格式化样式的详细介绍 在给定的文件内容中,展示了使用不同`style`参数值时`CONVERT`函数的输出结果。下面对这些样式进行详细解释: ##### 1. ...
举例来说,如果你有一个名为`OrderDate`的日期字段,你可以用以下方式提取年份: ```sql SELECT DATEPART(year, OrderDate) AS 'OrderYear' FROM Orders; ``` 这将返回`Orders`表中每条订单的年份。 `DATEPART`...
本文将围绕《SqlServer转换Oracle.docx》文档中的关键知识点进行详细解析,帮助读者更好地理解和掌握SQL Server到Oracle迁移过程中的技术要点。 #### 二、连接字符串与数据源处理 在文档中提到了一种获取连接字符串...
在SQL Server 2000中,库函数是数据库管理系统提供的一系列内置函数,用于处理各种数据类型和执行特定操作。这些函数极大地丰富了SQL语言的功能,使得开发人员和DBA能够更高效地管理和操作数据库。下面将详细介绍SQL...
SQL Server 2000是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理领域有着广泛的应用。本资源包含的是SQL Server 2000的两个示例数据库源码,分别是Northwind和Pubs,这两个数据库经常被用于教学、...
- 初始化数据:生成初始的日期范围,通常从远古时期到预计未来一段时间,以确保覆盖所有可能的查询需求。 - 填充属性:根据日期计算并填充各个属性,如年份、月份、星期等。 - 维护索引:为了提高查询性能,可能需要...
例如,如果我们不知道具体有多少个年份,可以先获取所有年份,然后构建Pivot的SQL语句: ```sql DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N', p.' + QUOTENAME(Year) FROM (SELECT DISTINCT Year FROM ...
3. **DATENAME**: 该函数返回指定日期部分的名称,如月份名或星期名。例如,`DATENAME(month, '2022-01-01')` 返回 "January"。 4. **DATEPART**: 这个函数返回日期中的特定部分,如年份、月份、日期等。例如,`...
它提供了丰富的内置函数来简化编程任务,而SQL Server作为流行的数据库管理系统,也有自己的函数集用于数据处理和查询。本文将详细介绍Visual Basic和SQL Server中的主要函数类别。 **Visual Basic 函数** 1. **...
在SQL Server 2000中,函数被广泛应用于各种数据库操作,包括数值计算、字符串处理、日期时间操作、类型转换等。下面我们将详细探讨SQL Server 2000中的一些常用函数。 1. **数值函数**: - `ABS()`: 返回一个数的...
### SQL Server 基本函数详解 #### 一、字符串函数 在 SQL Server 中,字符串函数主要用于处理文本数据,包括但不限于长度分析、字符操作、字符串查找等。 ##### 1. 长度与分析用 - **datalength(Char_expr)**:...
在SQL Server中,日期函数是处理日期和时间数据的关键工具,它们可以帮助我们进行各种日期相关的计算和转换。本文主要介绍了SQL Server中的一些常见日期函数,包括`DATENAME`、`DATEPART`、`DATEADD`、`DATEDIFF`、`...
SQL Server中的日期函数是数据库操作中非常常用的功能,它们用于处理和操纵日期和时间数据。在SQL Server中,有多种日期函数可以帮助我们提取、转换和计算日期和时间。以下是基于提供的内容对这些函数的详细解释: ...