首页 » SQL Server » 自定义星期几做为划分依据批量生成每个月的周信息(一):基

自定义星期几做为划分依据批量生成每个月的周信息(一):基

原文 http://blog.csdn.net/ronghua189/article/details/79175216

2018-01-30 02:01:25阅读(556)

最近在准备写个工作周报记录和跟踪的小程序,其中有个功能点就是对于创建的周报内容需要选择一个归属周期,为了更贴合实际工作场景和操作习惯,希望在选择归属周期的时候,显示的选择项内容为“X月第X周”归属周期信息可以批量生成,在遇到跨月(年)的时候自能够定义星期几所在月份决定归属周期。
举个例子:2018-01- 29/2018年2月4日这是一个完整的自然周(以中国星期计算方式周一做为开始周日做为结束的时间范围),在这个自然周中,周一到周三隶属于一月份,周四到周日却归属于二月份,这就出现了一个自然周跨月的情况。这个时候如果以周一到周三中的某一天做为周期归属划分依据,划分结果属于一月份的最后一周,但如果是用周四到周日中的某一天做为划分依据,自然划分结果就应该是属于二月份的第一周。
如果考虑不特这种划性质方式的话,可以把具体的某个日期看成是一个静态的常量,特殊性质的划分方式只是这个常量的一种额外附加属性。所以在设计这个功能点的时候,把所有的日期做为一个常量数据存储下来,额外的属性再从这个数据中进行整合分类,所以需要构建一个日期的基础数据。
在设计这个日期数据表字段的时候,从两个角度来决定设计依据,即固定属性(基础属性)和动态属性,设计字段的时候只考虑固定属性的保留。
从我个人理解来说,固定属性就是做为一个日期被大家熟知并且的英文通用的表述项首先,一个具体的日期是由年,月,日这三个部分共同组成和确定的;其次,现在世界各国通用一星期七天的制度,对于一个日期在特定环境中我们也。会用“星期几”来替代要表述的具体或是一类日期 ;第三,因为七天为一个星期,公历一年为365个自然日,所以能够通过计算得到某一年的系统总周数(因为得到这个总周数,现有计算机系统都有既定的计算逻辑,所以习惯叫系统总周数),某个具体日期也可以被归置到具体的某一周中,但这个周数根据世界各地方文化差异(以哪一天做为周始天)会有略微差别,但差别不会非常大,也可以在特定文化范围内看成是一个固定属性;最后,在实际工作中,一般对于一些工作目标或者绩效的范围制定都习惯用“季度”来表述,三个月为一个季度,一年四个季度,所以“季度”在中国文化内也是一个固定属性,但需关系关系着年份一起来用才能做为一个明确的表述形式。
动态属性这里是指根据各地文化的差异,对日期的一些特殊叫法或者是分类规则。例如有些的确对于星期的沿用“星耀”这种方式表述,一星期中的各天不以数字表述,而是以日,月及五大行星等七个主要星体来对应表述。
根据上述原则,这边对基础表的设计如下:

字段名 数据类型 备注说明 ID int 标识自增ID DateValue varchar(20) 日期(yyyy-MM-dd) YearValue smallint 日期所在年份 MonthValue smallint 日期所在月份 DayMonthValue smallint 日期所在月份第几天 DayYearValue smallint 日期所在年份第几天 DayWeekValue smallint 日期所在星期第几天 DayWeekName varchar(50) 日期所在星期第几天文字描述 WeekValue smallint 日期所在年份的第几个星期 QuarterValue smallint 日期所在年份季度 QuarterName varchar(50) 日期所在年份季度文字描述
CREATE TABLE [dbo].[ComCalendarInfo](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DateValue] [varchar](20) NOT NULL,
    [YearValue] [smallint] NOT NULL,
    [MonthValue] [smallint] NOT NULL,
    [DayMonthValue] [smallint] NOT NULL,
    [DayYearValue] [smallint] NOT NULL,
    [DayWeekValue] [smallint] NOT NULL,
    [DayWeekName] [varchar](50) NOT NULL,
    [WeekValue] [smallint] NOT NULL,
    [QuarterValue] [smallint] NOT NULL,
    [QuarterName] [varchar](50) NOT NULL,
 CONSTRAINT [PK_ComCalendarInfo] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期(yyyy-MM-dd)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'DateValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在年份' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'YearValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在月份' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'MonthValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在月份第几天' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'DayMonthValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在年份第几天' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'DayYearValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在星期第几天' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'DayWeekValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在星期第几天文字描述' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'DayWeekName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在年份的第几个星期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'WeekValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在年份季度' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'QuarterValue'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日期所在年份季度文字描述' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ComCalendarInfo', @level2type=N'COLUMN',@level2name=N'QuarterName'
GO

表创建完之后,就是根据实际需要批量填充数据,这里主要是用到的SqlServer的的的自带日期函数DATENAME,DATEPART,DATENAME这里以2018年1月1日到2019年12月31日做为填充范围:

DECLARE @WeekString varchar(12), @iWeek smallint,
@dDate SMALLDATETIME, @sMonth smallint, @iYear smallint, 
@iDayOfMonth smallint, @iDayOfYear smallint,@iWeekOfYear smallint, @iMonthOfYear smallint, @iQuarter smallint,
@sQuarter varchar(2), @sDate varchar(20),@adddays int    
SELECT @adddays = 1 --日期增量(可以自由设定) 
SELECT @dDate = '2018-01-01' --开始日期  
SET DATEFIRST 1 --设置周一为每一周一天    
WHILE @dDate <= '2019-12-31'  --结束日期 
BEGIN    
   SELECT @WeekString = DATENAME (dw, @dDate) 
   select @iWeek = DATEPART(dw,@dDate)
   SELECT @sMonth=DATENAME(mm,@dDate) 
   SELECT @iYear= DATENAME (yy, @dDate) 
   SELECT @iDayOfMonth=DATENAME (dd, @dDate) 
   SELECT @iWeekOfYear= DATENAME (week, @dDate) 
   SELECT @iMonthOfYear=DATEPART(month, @dDate) 
   SELECT @iQuarter = DATENAME (quarter, @dDate)
   SELECT @sQuarter = 'Q' +  CAST(@iQuarter as varchar(1))
   select @sDate = CONVERT(varchar(10),@dDate,25)
   select @iDayOfYear=DATEDIFF(d,convert(nvarchar(4),@iYear)+'-01-01',@sDate)+1
   INSERT INTO ComCalendarInfo([DateValue],[YearValue],[MonthValue] ,[DayMonthValue] ,[DayYearValue],[DayWeekValue],[DayWeekName],[WeekValue],[QuarterValue],[QuarterName]) VALUES    (@sDate,@iYear,@iMonthOfYear,@iDayOfMonth,@iDayOfYear,@iWeek,@WeekString, @iWeekOfYear,@iQuarter,@sQuarter)    
   SELECT @dDate =@dDate+@adddays
END 

填充完后的数据内容为
自定义星期几做为划分依据批量生成每个月的周信息(一):基

到这里,为后续选择归属周期这个功能做的日期基础数据构建就完成了。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹