SQL:利用系统spt_values构造特定日期表

2021-04-25  本文已影响0人  徐胥

spt_values表是SQL自带的系统常量表,一般在master库中。spt_values表中,最被常用的就是[TYPE]为P的数据,含0-2047共2048个整数。

spt_values中type为P的数据内容

做日期表的思路,是选定某日的日期,日期依次增序,以日期为键产出星期等,最终就形成了日期表。这里,我们尝试做月表,只需要取每月一日即可。

月表形成

以上代码解释两个点:

① inner join 后的那个构造表curdt,其实只会返回当前月1号的日期,也是我们选定的起始月。

我们知道数据库的日历中,其实是存在起止日期的,超过这个日期,数据库是不认识这个日期的。这里我们就用了SQL的这个特性,我们用datediff去取getdate()和最小日期之间的月份数,再在最小日期上加上这个月份数,因为以月为单位,无关天数,故我们可以取到当前月的第一天。这个方法也被我们广泛用在日期处理上。

我们在dateadd中可以利用0,指代1900-01-01。那么1是指代哪个日期呢,大家不妨去运行试试看。

选取当前日期和起始日期之间的相隔月份数

② inner join 的on后面写的是1= 1,注意这个不可乱用,因为会笛卡尔积。但由于我们的构造表curdt内只有一行日期数据,所以sv表不会翻倍数据。


好啦,由于我们的代码没有日期限制,所以我们将会取到当前月开始的2048个月的数据,未免有些太多了。我们可以在where条件中,通过sv.number直接限定月份数,也可以利用我们构造的month字段,限定月份数。

上一篇下一篇

猜你喜欢

热点阅读