SQL:按日期时间过滤数据

时间:2015-04-07 21:51:02

标签: sql sql-server datetime

我有一个庞大的表,我正在尝试在MS SQL Server Management Studio中瘦身。目前,每5秒数据就有一行。我想收缩表,每30分钟只保存1行。

例如,而不是在

处有数千行
    Timestamp            A   B   C
    2015-01-01 00:00:00  1   5   6
    2015-01-01 00:00:05  5   7   1
    2015-01-01 00:00:10  2   2   3
    2015-01-01 00:00:15  2   1   0
    ......
    2015-04-10 13:55:55  4   5   6
    2015-04-10 13:56:00  6   4   2

我想把它稀释掉,所以我只有

    Timestamp            A   B   C
    2015-01-01 00:00:00  1   5   6
    2015-01-01 00:30:00  2   5   7
    2015-01-01 01:00:00  1   7   6
    ......
    2015-04-10 13:30:00  4   5   6
    2015-04-10 14:00:00  6   4   2

谢谢!

4 个答案:

答案 0 :(得分:3)

根据您的样本数据,您可以这样做:

select t.*
from table t
where datepart(minute, timestamp) in (0, 30) and
      datepart(second, timestamp) = 0;

答案 1 :(得分:0)

delete from [massive Table] where datepart(mi,timestamp) not in (0,30)

将删除与您的条件不符的所有行。

答案 2 :(得分:0)

如果您的时间不是0或5,那么您可以尝试这样做。

Delete
From    YourTable
Where   DateDiff(Second, '20000101', TimeStamp) % 1800 > 4

这可以通过计算自2000年1月1日以来已过期的秒数来实现.mod运算符用于计算您想要保留的间隔。 30分钟内有1800秒。因此,应删除秒数大于4的任何内容。基本上,我们不是考虑小时,分钟和秒的时间,而是考虑1800秒间隔的时间,这就是你想要的。

答案 3 :(得分:0)

从一组行中选择一行时,编写依赖于可能不正确的假设的代码并不总是一个好主意。例如,当查找小时和半小时的第一个条目时,是否保证始终存在带有时间戳的条目" hh-00-00"和" hh-30-00"?您的示例数据显示,但这是否以这种方式准确地表示您的实际数据?

您可能想要说的是,您希望在每小时和半小时的边界之后保留"第一个条目。"这样,你知道你每半小时间隔会有一个条目,即使第一个条目是在一小时或半小时后两秒钟进入。

所以第一步是将日期分成半小时组。我发现这样做的最好方法是

Convert( SmallDatetime, Floor( Cast( Timestamp AS float ) * 48.0 ) / 48.0 )

在查询列表的末尾添加并查看是否正确的时间(向下舍入到完全在小时或正好在半小时)。特别注意非常接近(边界之前和之后)的时间。

使用它,可以很容易地生成每半小时增量中首次出现的时间列表。您不必担心每个增量都有一个与半小时边界匹配的条目。加入即可获得完整的行列表。删除所有其余的。

with
Halfs( HalfHour )as(
    select  Min( Timestamp )
    from    TData
    group by Convert( SmallDatetime, Floor( Cast( Timestamp AS float ) * 48.0 ) / 48.0 )
)
select  t.*
from    TData t
join    Halfs h
    on  h.HalfHour = t.TimeStamp;

http://sqlfiddle.com/#!6/65a5c/1/0