SQL Server时间粒度系列----第3节旬、月时间粒度详解

本文详细介绍了SQL Server中如何处理旬和月的时间粒度,包括获取日期所在旬、旬基准日期与整数转换、月基准日期转换等功能,并提供了T-SQL代码示例。此外,还讨论了函数重构以减少重复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL Server时间粒度系列----第3节旬、月时间粒度详解
本文目录列表:
1、SQL Server旬时间粒度
2、SQL Server月有关时间粒度
3、SQL Server函数重构
4、总结语
5、参考清单列表
 
SQL Server旬时间粒度
 
    SQL Server不存在旬这个时间粒度,这个时间粒度在我们国家存在的。一个月分为上、中、下3旬,上旬和中旬均10天,分别对应第1天到第10天和第11天到第20天,下旬有可能8天、9天、10天和11天,从第21天到月末最后1天。从旬的定义得知旬是个日期时间范围的,那么如何实现将旬时间粒度时间值和一个对应的整数来实现相互转换呢?从旬的定义得知每旬都有个开始日期的,这个日期我们就叫做旬基准日期。如果同一旬的任意一个日期都对应一个相同的整数,那么再将一个整数转换为一个旬基准日期,这样我们可以实现旬基准日期和整数的相互转换。我们还可以得到每个日期在所在旬的第几天,也可以将得到一个月份每日期所在的旬索引(这个类似每周的任何一天对应的weekday值,从1到7分别对应星期一到星期日)。
    
     提供获得指定日期在当前月哪个旬的功能的函数,T-SQL代码如下:
 View Code
    


    提供获得指定日期在当前旬第几天的功能函数,T-SQL代码如下:
 View Code
    


    提供旬基准日期和整数相互转换的功能函数,T-SQL代码如下:
 View Code
 


    测试以上4个函数效果的T-SQL代码如下:
 View Code
 


    执行后的查询结果如下图:








 
SQL Server月有关时间粒度
 
    在旬时间粒度小节中,我们引入了旬基准日期的概念,针对月基准日期的定义就是每月的第一天代表的日期时间值,比如”2016-01-08“所在的月基准日期就是”2016-01-01“。我们也提供月基准日期和整数相互转换的功能函数。指定日期的月份在当前季度中的月索引,从1开始计数,包括1、2、3。SQL Server提供了month(@dtmDateTime)或datepart(month, @dtmDateTime)获取指定日期所在月份(当前年的份索引,从1开始计数,包括1,、2、3、……、10、11、12)。
    提供获得指定日期的月份在当前季度的月索引,T_SQL代码如下:
 View Code
 


    提供月基准日期和整数相互转换的功能函数,T-SQL代码入下:
 View Code
 


    测试有关月时间粒度的函数效果的T-SQL代码如下:
 View Code
 


    执行后的查询结果如下图:


 
 
SQL Server函数重构
 
   在旬和月时间粒度已经提供的功能函数,我们会针对指定的日期时间和整数参数做进行相应的条件处理,发现了很多的重复T-SQL代码,为消除相似功能的重复代码,我将其封装在以下两个功能函数ufn_GetVlidDate和ufn_GetValidDateNum,分别提供对指定的日期时间和指定的日期数的有效性处理。
    
    提供以上功能函数的重构,T-SQL代码如下:
 View Code
 


    测试以上功能函数的T-SQL代码如下:
 View Code
 


    执行后的查询结果如下图:


 
注意:重复的代码实现了重构,本文中提供的重复代码所在的函数没有做变更的,需要的话请自己调整和修改代码。
 
    测试日期时间与加减运算符的效果,T-SQL代码如下:
 View Code
 


    执行后的查询结果如下图:




 
注意:以上的测试代码,SQL Server引擎默认使用了基准日期”1900-01-01“。
 
总结语
    
    本文在SQL Server时间粒度详解小节中,提供了获取指定日期所在旬的日索引功能和获取指定日期的所在旬在当前月的旬索引,以及旬基准日期和整数相互转换的功能函数。还实现了月基准日期和整数相互转换的功能函数,获取指定日期的月份在当前季度的月索引功能。还提供了T-SQL代码重构的例子,通过封装通用的功能函数来消除重复的T-SQL代码。也提供了日期时间数据类型的变量与加减运算符的测试代码,主要印证SQL Server引擎默认也是在使用基准日期”1900-01-01“。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值