基于参数日期获取事务数据集最新记录的SQL UDF实现
实现日期匹配的SQL用户定义函数
数据集
| RowID | UserId | REC_START_DATE | REC_END_DATE |
|---|---|---|---|
| 1 | 31 | 2015-01-05T00:00:00Z | 2015-01-05T00:00:59Z |
| 2 | 31 | 2015-01-05T00:01:00Z | 2015-01-05T00:01:59Z |
| 3 | 31 | 2015-01-05T00:02:00Z | 2015-01-05T00:02:59Z |
| 4 | 31 | 2015-01-05T00:03:00Z | 2015-07-21T23:59:59Z |
| 5 | 31 | 2015-07-22T00:00:00Z | 2015-07-22T00:00:59Z |
| 6 | 31 | 2015-07-22T00:01:00Z | 2015-07-22T23:59:59Z |
| 7 | 31 | 2015-07-23T00:00:00Z | 2015-07-23T00:00:59Z |
| 8 | 31 | 2015-07-23T00:01:00Z | 2016-05-22T23:59:59Z |
| 9 | 31 | 2016-05-23T00:00:00Z | 2016-05-23T00:00:59Z |
| 10 | 31 | 2016-05-23T00:01:00Z | 2016-05-23T00:01:59Z |
| 11 | 31 | 2016-05-23T00:02:00Z | 2016-05-23T00:02:59Z |
| 12 | 31 | 2016-05-23T00:03:00Z | 2017-04-26T23:59:59Z |
| 13 | 31 | 2017-04-27T00:00:00Z | 2017-04-27T00:00:59Z |
| 14 | 31 | 2017-04-27T00:01:00Z | 2017-04-27T23:59:59Z |
| 15 | 31 | 2017-04-28T00:00:00Z | 2017-04-28T00:00:59Z |
| 16 | 31 | 2017-04-28T00:01:00Z | 2017-07-02T23:59:59Z |
| 17 | 31 | 2017-07-03T00:00:00Z | 2017-07-03T00:00:59Z |
| 18 | 31 | 2017-07-03T00:01:00Z | 2017-07-03T00:01:59Z |
| 19 | 31 | 2017-07-03T00:02:00Z | 2017-07-03T00:02:59Z |
| 20 | 31 | 2017-07-03T00:03:00Z | 2018-01-03T11:23:20Z |
| 21 | 31 | 2018-01-03T11:23:21Z | 2018-03-29T23:59:59Z |
| 22 | 31 | 2018-03-30T00:00:00Z | 2018-03-30T00:00:59Z |
| 23 | 31 | 2018-03-30T00:01:00Z | 2018-03-30T23:59:59Z |
| 24 | 31 | 2018-03-31T00:00:00Z | 2018-03-31T00:00:59Z |
| 25 | 31 | 2018-03-31T00:01:00Z | 2018-04-08T23:59:59Z |
| 26 | 31 | 2018-04-09T00:00:00Z | 2018-04-09T00:00:59Z |
| 27 | 31 | 2018-04-09T00:01:00Z | 2018-04-09T00:01:59Z |
| 28 | 31 | 2018-04-09T00:02:00Z | 2018-04-09T00:02:59Z |
| 29 | 31 | 2018-04-09T00:03:00Z | 2018-05-27T23:59:59Z |
| 30 | 31 | 2018-05-28T00:00:00Z | 2018-05-31T23:59:59Z |
| 31 | 31 | 2018-06-01T00:00:00Z | 2018-06-01T23:59:59Z |
| 32 | 31 | 2018-06-02T00:00:00Z | 2018-06-02T00:00:59Z |
| 33 | 31 | 2018-06-02T00:01:00Z | 2018-09-26T23:59:59Z |
| 34 | 31 | 2018-09-27T00:00:00Z | 2018-09-27T00:00:59Z |
| 35 | 31 | 2018-09-27T00:01:00Z | 2018-09-27T23:59:59Z |
| 36 | 31 | 2018-09-28T00:00:00Z | 2018-09-28T00:00:59Z |
| 37 | 31 | 2018-09-28T00:01:00Z | 2018-09-28T00:01:59Z |
| 38 | 31 | 2018-09-28T00:02:00Z | 2018-09-28T00:02:59Z |
| 39 | 31 | 2018-09-28T00:03:00Z | 2018-09-28T00:03:59Z |
| 40 | 31 | 2018-09-28T00:04:00Z | 2018-09-28T00:04:59Z |
需求说明
- 创建接收日期参数的SQL用户定义函数(UDF)
- 返回有效期覆盖传入日期的最新记录
- 若单日存在多条符合条件的记录,返回时间戳最新的那条(即
REC_START_DATE最晚的记录) - 示例:传入
'2015-08-01'时,应返回RowID为8的记录,该记录的有效期(2015-07-23至2016-05-22)覆盖了传入日期,且是对应时间段的最新数据
初始代码问题
初始实现的WHERE条件存在逻辑错误:
REC_END_DATE > @paramDate无法准确判断日期是否在有效期内,正确逻辑应为传入日期处于REC_START_DATE和REC_END_DATE之间(包含边界)year(REC_END_DATE) = year(@paramDate)会错误过滤跨年度的有效记录(比如RowID8的REC_END_DATE为2016年,传入2015年日期时会被排除)
修正后的UDF实现
CREATE OR REPLACE FUNCTION getLastRec ( @paramDate date ) RETURNS TABLE AS RETURN SELECT TOP 1 * FROM MyTable -- 判断传入日期是否在记录的有效期范围内 WHERE REC_START_DATE <= @paramDate AND REC_END_DATE >= @paramDate -- 按记录起始时间倒序,确保取到最新的有效记录;若RowID为自增序列,也可替换为ORDER BY RowID DESC ORDER BY REC_START_DATE DESC
调用示例
SELECT * FROM getLastRec('2015-08-01')
调用后将返回RowID为8的记录,符合需求。
内容的提问来源于stack exchange,提问作者AKJ
相关产品推荐
相关产品推荐

