最近在准备写个工作周报记录和跟踪的小程序,其中有个功能点就是对于创建的周报内容需要选择一个归属周期,为了更贴合实际工作场景和操作习惯,希望在选择归属周期的时候,显示的选择项内容为“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 | 日期所在星期第几天 |