【问题标题】:How to Select Data in Between Timestamps Separated by a 30 Second Interval如何在间隔 30 秒的时间戳之间选择数据
【发布时间】:2018-10-11 16:34:58
【问题描述】:

美好的一天。我有两张桌子,TableATableBTableA 有一个开始和停止时间。 TableB 有带时间戳的数据。我试图将TableA 分隔成一个更大的表,间隔为 30 秒,并让TableBs 数据连接到开始时间和停止时间之间最近的 30 秒时间戳。

如何有效地创建一个以 30 秒为间隔的表格,并根据最近的时间戳连接另一个表格数据?任何帮助深表感谢。

表A

pkid     dateEntered
    1       2018-10-09 14:18:34.823
    2       2018-10-09 14:28:30.963

表B

processVal  dateEntered
55.2431   2018-10-09 14:18:34.953
55.2158   2018-10-09 14:19:04.960
54.7972   2018-10-09 14:19:34.963
54.7933   2018-10-09 14:20:04.963
54.7661   2018-10-09 14:20:34.967
54.7427   2018-10-09 14:21:04.967
54.7193   2018-10-09 14:21:34.970
54.6921   2018-10-09 14:22:04.970
54.6668   2018-10-09 14:22:34.973
54.6375   2018-10-09 14:23:04.973
54.6142   2018-10-09 14:23:34.977
54.585    2018-10-09 14:24:04.977
54.5597   2018-10-09 14:24:34.980
54.5363   2018-10-09 14:25:04.980
54.509    2018-10-09 14:25:34.983
54.4857   2018-10-09 14:26:04.987
54.4584   2018-10-09 14:26:34.987
54.435    2018-10-09 14:27:04.987
54.4097   2018-10-09 14:27:34.990
54.3825   2018-10-09 14:28:04.990

期望的结果

55.2431   2018-10-09 14:18:30.000
55.2158   2018-10-09 14:19:00.000
54.7972   2018-10-09 14:19:30.000
54.7933   2018-10-09 14:20:00.000
54.7661   2018-10-09 14:20:30.000
54.7427   2018-10-09 14:21:00.000
54.7193   2018-10-09 14:21:30.000
54.6921   2018-10-09 14:22:00.000
54.6668   2018-10-09 14:22:30.000
54.6375   2018-10-09 14:23:00.000
54.6142   2018-10-09 14:23:30.000
54.585    2018-10-09 14:24:00.000
54.5597   2018-10-09 14:24:30.000
54.5363   2018-10-09 14:25:00.000
54.509    2018-10-09 14:25:30.000
54.4857   2018-10-09 14:26:00.000
54.4584   2018-10-09 14:26:30.000
54.435    2018-10-09 14:27:00.000
54.4097   2018-10-09 14:27:30.000
54.3825   2018-10-09 14:28:00.000

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您能否尝试使用 CASE 语句和 DATEADD() 函数执行 SQL 选择

    declare @startdate datetime = '2018-10-09 14:18:34.823'
    declare @enddate datetime = '2018-10-09 14:28:30.963'
    
    select 
        case when DATEPART(ss, DateEntered) < 30 
        then 
            dateadd(ms,-1 * (DATEPART(ms, DateEntered) ), dateadd(ss,-1 * (DATEPART(ss, DateEntered) ),DateEntered))
        else 
            dateadd(ms,-1 * (DATEPART(ms, DateEntered) ), dateadd(ss,60 -1 * (DATEPART(ss, DateEntered) ),DateEntered)) 
        end
    from TableB
    where
    DateEntered between @startdate and @enddate
    

    【讨论】:

    • 如果希望将 30 秒作为动态参数,是否将 30 替换为变量?我试过这样做,但它似乎只解析到每分钟,但不是每 120 秒解析一次。
    • 代码通过仅检查时间值的秒部分来决定舍入。因此,如果您需要在 2 分钟之间进行四舍五入,则需要检查分钟的最后一位。如果是偶数,则四舍五入到下界,如果是奇数,则四舍五入到上界。我也可以准备它的代码,但要使其动态化需要更多的控制
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2017-01-30
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多