You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于参数日期获取事务数据集最新记录的SQL UDF实现

实现日期匹配的SQL用户定义函数

数据集

RowIDUserIdREC_START_DATEREC_END_DATE
1312015-01-05T00:00:00Z2015-01-05T00:00:59Z
2312015-01-05T00:01:00Z2015-01-05T00:01:59Z
3312015-01-05T00:02:00Z2015-01-05T00:02:59Z
4312015-01-05T00:03:00Z2015-07-21T23:59:59Z
5312015-07-22T00:00:00Z2015-07-22T00:00:59Z
6312015-07-22T00:01:00Z2015-07-22T23:59:59Z
7312015-07-23T00:00:00Z2015-07-23T00:00:59Z
8312015-07-23T00:01:00Z2016-05-22T23:59:59Z
9312016-05-23T00:00:00Z2016-05-23T00:00:59Z
10312016-05-23T00:01:00Z2016-05-23T00:01:59Z
11312016-05-23T00:02:00Z2016-05-23T00:02:59Z
12312016-05-23T00:03:00Z2017-04-26T23:59:59Z
13312017-04-27T00:00:00Z2017-04-27T00:00:59Z
14312017-04-27T00:01:00Z2017-04-27T23:59:59Z
15312017-04-28T00:00:00Z2017-04-28T00:00:59Z
16312017-04-28T00:01:00Z2017-07-02T23:59:59Z
17312017-07-03T00:00:00Z2017-07-03T00:00:59Z
18312017-07-03T00:01:00Z2017-07-03T00:01:59Z
19312017-07-03T00:02:00Z2017-07-03T00:02:59Z
20312017-07-03T00:03:00Z2018-01-03T11:23:20Z
21312018-01-03T11:23:21Z2018-03-29T23:59:59Z
22312018-03-30T00:00:00Z2018-03-30T00:00:59Z
23312018-03-30T00:01:00Z2018-03-30T23:59:59Z
24312018-03-31T00:00:00Z2018-03-31T00:00:59Z
25312018-03-31T00:01:00Z2018-04-08T23:59:59Z
26312018-04-09T00:00:00Z2018-04-09T00:00:59Z
27312018-04-09T00:01:00Z2018-04-09T00:01:59Z
28312018-04-09T00:02:00Z2018-04-09T00:02:59Z
29312018-04-09T00:03:00Z2018-05-27T23:59:59Z
30312018-05-28T00:00:00Z2018-05-31T23:59:59Z
31312018-06-01T00:00:00Z2018-06-01T23:59:59Z
32312018-06-02T00:00:00Z2018-06-02T00:00:59Z
33312018-06-02T00:01:00Z2018-09-26T23:59:59Z
34312018-09-27T00:00:00Z2018-09-27T00:00:59Z
35312018-09-27T00:01:00Z2018-09-27T23:59:59Z
36312018-09-28T00:00:00Z2018-09-28T00:00:59Z
37312018-09-28T00:01:00Z2018-09-28T00:01:59Z
38312018-09-28T00:02:00Z2018-09-28T00:02:59Z
39312018-09-28T00:03:00Z2018-09-28T00:03:59Z
40312018-09-28T00:04:00Z2018-09-28T00:04:59Z

需求说明

  • 创建接收日期参数的SQL用户定义函数(UDF)
  • 返回有效期覆盖传入日期的最新记录
  • 若单日存在多条符合条件的记录,返回时间戳最新的那条(即REC_START_DATE最晚的记录)
  • 示例:传入'2015-08-01'时,应返回RowID为8的记录,该记录的有效期(2015-07-23至2016-05-22)覆盖了传入日期,且是对应时间段的最新数据

初始代码问题

初始实现的WHERE条件存在逻辑错误:

  1. REC_END_DATE > @paramDate 无法准确判断日期是否在有效期内,正确逻辑应为传入日期处于REC_START_DATE和REC_END_DATE之间(包含边界)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:02:02