【问题标题】:Filter time values that are a set period either side of a specified time过滤指定时间任一侧的设定时间段的时间值
【发布时间】:2015-04-20 08:57:23
【问题描述】:

给定一个指定的时间值和一个区间值:

Specified Time: 13:25:00
Interval Value: 00:20:00

如何过滤下表中的值以返回 指定时间两侧的指定间隔时间。

12:45:24
13:05:00
13:50:30
14:50:32
15:15:10

我想要一个函数或查询来检查“13:25:00”是否与表中的任何时间有“00:20:00”差异。

输出应该返回:

13:05:00

【问题讨论】:

  • 不清楚,这里需要更多描述
  • 是什么让你的时间特别?
  • 所以您想找到“特殊时间”两侧 20 分钟的时间......所以输出将是:13:05:00 如果您要工作到秒?
  • special 老兄是什么意思?

标签: sql sql-server function datediff date-difference


【解决方案1】:

根据您提供的信息,我假设您希望从列表中获取“特殊时间”任一侧的指定时间段的值。

这是使用DATEADD 的一种方法:

-- temp table for your sample data
CREATE TABLE #times ( val TIME )

INSERT  INTO #times
        ( val )
VALUES  ( '12:45:24' ),
        ( '13:05:00' ),
        ( '13:50:30' ),
        ( '14:50:32' ),
        ( '15:15:10' )

DECLARE @special_time TIME = '13:25:00'      
DECLARE @diff_value TIME = '00:20:00'

-- variable will hold the total number of seconds for your interval
DECLARE @diff_in_seconds INT

-- gets the total number of seconds of your interval -> @diff_value 
SELECT  @diff_in_seconds = DATEPART(SECOND, @diff_value) + 60
        * DATEPART(MINUTE, @diff_value) + 3600 * DATEPART(HOUR, @diff_value)

-- get the values that match the criteria
SELECT  *
FROM    #times
WHERE   val = DATEADD(SECOND, @diff_in_seconds, @special_time)
        OR val = DATEADD(SECOND, -( @diff_in_seconds ), @special_time)

DROP TABLE #times

请注意,WHERE 子句通过加减差来过滤结果。减法是通过将@diff_in_seconds 设为负数来实现的。

【讨论】:

  • 感谢您的回答能否请您更改它以便我为这个解决方案工作 1.我的时间之前已插入表格中,所以我想使用 select 来抓取它们 2.特殊时间可以是参数3.X时间可以参数化
  • @user1998368 我不太明白你的要求是什么意思。我的回答是简单地模拟一个表来复制您的数据,然后从中进行选择,这样听起来就像它涵盖了第 1 点。特殊时间和 X 时间都被声明为变量/参数,所以听起来它涵盖了第 2 点和3.
【解决方案2】:

如果我们正确理解您的问题,您希望所有时间都比您的给定(特殊)时间超过 20 分钟。

要实现这一点,只需使用包含如下子句的 where 子句进行选择:abs(datediff(minute, tableDate, @specialdate)) > 20

SQLFiddle sample 和代码示例:

declare @specialDate datetime = '1900-01-01 13:25:00'

select *
  from SampleData
 where abs(datediff(minute, SomeDate, @specialDate)) > 20

请注意,我将 Datetime 列的日期设置为 1900-01-01 作为模糊参考,请根据您的设置进行调整。

您需要在该行中使用ABS 以确保检查结果datediff 的两个变体(它可以带回0、> 0 或

参考资料:
MSDN: DATEDIFF
MSDN: ABS

【讨论】:

    【解决方案3】:

    这里有一个解决方案:

    create table t(t time);
    
    insert into t
    values
        ('12:45:24'),
        ('13:05:00'),
        ('13:50:30'),
        ('14:50:32'),
        ('15:15:10')
    
    declare @st time = '13:25:00'
    declare @dt time = '00:20:00'
    
    select * from t
    where abs(datediff(ss, t, @st)) - datediff(ss, '00:00:00', @dt) = 0
    

    abs(datediff(ss, t, @st) 将保存表格时间和特殊时间之间的秒数差异。您将此差异与00:00:00 和区间datediff(ss, '00:00:00', @dt) 之间的差异进行比较

    输出:

    t
    13:05:00.0000000
    

    小提琴http://sqlfiddle.com/#!6/05df4/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多