SQL 计算一个季度的开始日期和结束日期,以 yyyyq 格式(前面 4 位是年份,最后 1 位是季度序号)给出了年份和季度序号,你希望找出该季度的开始日期和结束日期。
SQL 计算一个季度的开始日期和结束日期 问题描述
以 yyyyq 格式(前面 4 位是年份,最后 1 位是季度序号)给出了年份和季度序号,你希望找出该季度的开始日期和结束日期。
SQL 计算一个季度的开始日期和结束日期 解决方案
本解决方案的关键之处在于如何使用模函数从 yyyyq 值里提取出季度序号。(如果不想使用模计算,也可以简单地借助子字符串函数提取出 yyyyq 的最后一个数字以得到季度序号,因为我们知道前面 4 位表示年份。)得到了季度序号之后,只要乘以 3,就能计算出该季度最后一个月的月份。下述解决方案用到的内嵌视图 X
里包含了由年份和季度序号组合而成的 4
行数据。查询内嵌视图 X
的话,会得到下面的结果集。
DB2
使用 SUBSTR
函数从内嵌视图 X
里提取出年份,使用 MOD
函数提取出对应的季度序号。
Oracle
使用 SUBSTR
函数从内嵌视图 X
里提取出年份,使用 MOD
函数提取出对应的季度序号。
PostgreSQL
使用 SUBSTR
函数从内嵌视图 X
里提取出年份,使用 MOD
函数提取出对应的季度序号。
MySQL
使用 SUBSTR
函数从内嵌视图 X
里提取出年份,使用 MOD
函数提取出对应的季度序号。
SQL Server
使 SUBSTRING
函数从内嵌视图 X
里提取出年份,使用取模运算符(%
)提取出对应的季度序号。
SQL 计算一个季度的开始日期和结束日期 扩展知识
DB2
首先找出需要处理的年份和季度序号。调用 SUBSTR
函数从内嵌视图 X
(X.YRQ
)里提取出年份。为了获取季度序号,用 YRQ
对 10 取模。得到季度序号后,乘以 3 即得到该季度最后一个月的月份,结果如下所示。
现在已经得到了年份和每个季度最后一个月的月份。利用这些值可以构建出每个季度最后一个月第一天的日期。使用连接运算符||
把年份和月份连接起来,然后使用 DATE
函数将其转换为日期类型。
上述 Q_END
值是每个季度最后一个月的第一天。为了计算出该季度的结束日期,只要加上 1 个月,然后再减去 1 天即可。为了找出每个季度的开始日期,要从 Q_END
里减去 2 个月。
Oracle
首先找出需要处理的年份和季度序号。调用 SUBSTR
函数从内嵌视图 X
(X.YRQ
)里提取出年份。为获取季度序号,用 YRQ
对 10 取模。得到季度序号后,乘以 3 即得到该季度最后一个月的月份,结果如下所示。
现在已经得到了年份和每个季度最后一个月的月份。利用这些值可以构建出每个季度最后一个月第一天的日期。使用连接运算符||
把年份和月份连接起来,然后使用 TO_DATE
函数将其转换为日期类型。
上述 Q_END
值是每个季度最后一个月的第一天。为计算出该季度的结束日期,针对 Q_END
调用 LAST_DAY
函数即可。为找出每个季度的开始日期,要调用 ADD_MONTHS
函数从 Q_END
里减去 2 个月。
PostgreSQL
首先找出需要处理的年份和季度序号。调用 SUBSTR
函数从内嵌视图 X
(X.YRQ
)里提取出年份。为获取季度序号,用 YRQ
对 10 取模。得到季度序号后,乘以 3 即得到该季度最后一个月的月份,结果如下所示。
现在已经得到了年份和每个季度最后一个月的月份。利用这些值可以构建出每个季度最后一个月第一天的日期。使用连接运算符||
把年份和月份连接起来,然后使用 TO_DATE
函数将其转换为日期类型。
上述 Q_END
值是每个季度最后一个月的第一天。为计算出该季度的结束日期,在 Q_END
基础上加上 1 个月,再减去 1 天即可。为找出每个季度的开始日期,要从 Q_END
里减去 2 个月。最后要把计算结果转换为日期类型。
MySQL
首先找出需要处理的年份和季度序号。调用 SUBSTR
函数从内嵌视图 X
(X.YRQ
)里提取出年份。为获取季度序号,用 YRQ
对 10 取模。得到季度序号后,乘以 3 即得到该季度最后一个月的月份,结果如下所示。
现在已经得到了年份和每个季度最后一个月的月份。利用这些值可以构建出每个季度的结束日期。先使用 CONCAT
函数把年份和月份连接起来,然后使用 STR_TO_DATE
函数将其转换为日期类型。最后,调用 LAST_DAY
函数计算出每个季度的最后一天。
因为我们已经知道了每个季度的结束日期,剩下的工作就是要计算出开始日期。调用 DAY
函数计算出每个季度的结束日期分别是当前月份的第几天,接着调用 ADDDATE
函数从 Q_END
里减去该计算结果,这样就得到了前一个月的最后一天;再加上 1 天,就得到了每个季度最后一个月的第一天。最后,调用 DATE_ADD
函数从上述结果日期里减去 2 个月,至此我们就得到了每个季度的开始日期。
SQL Server
首先找出需要处理的年份和季度序号。调用 SUBSTRING
函数从内嵌视图 X
(X.YRQ
)里提取出年份。为获取季度序号,用 YRQ
对 10 取模。得到季度序号后,乘以 3 即得到该季度最后一个月的月份,结果如下所示。
现在已经得到了年份和每个季度最后一个月的月份。利用这些值可以构建出每个季度最后一个月第一天的日期。使用连接运算符 + 把年份和月份连接起来,然后使用 CAST
函数将其转换为日期类型。
上述 Q_END
值是每个季度最后一个月的第一天。为计算出该季度的结束日期,只要调用 DATEADD
函数加上 1 个月,然后再减去 1 天即可。为找出每个季度的开始日期,需要调用 DATEADD
函数从 Q_END
里减去 2 个月。