【问题标题】:SQL Server datetime and data redundancySQL Server 日期时间和数据冗余
【发布时间】:2015-09-29 09:19:41
【问题描述】:

我们有一个故障表,其中包含一个数据类型为datetime2(7) 的列DATE_ACTIVE。此列中的值如下:

2015-08-16 05:02:46.0000000
2015-08-16 05:13:25.0000000

我们需要从该表中获取活跃超过 10 分钟的记录(故障),并将它们推送到另一个表中,该表驱动仪表板指示活动 - 已关闭事务。我们在此表中有另一列指示故障状态(ACTIVECLOSED)。

我们决定继续执行以下操作来实现这一目标:

select * 
from table 
where 
     CONVERT( float , CONVERT( datetime , getdate() ) 
     - CONVERT( datetime , DATE_ACTIVE ) ) * 24 * 60 * 60 > 600

即使记录将其状态从活动更改为关闭并返回活动,此表也会保留该记录。没有唯一的 ID,因此对于从关闭 - 活动或反之亦然的每次转换都会插入一个新行。该表保留所有行,该表中没有任何内容被删除。所以上面提到的方法给了我们冗余数据。

例如:在上午 10 点插入的状态为 CLOSED 的记录每次在上午 10.10 之后都会被推送到下一个表,因为在该行的生命周期之前始终满足上述条件。

有没有办法防止这种情况发生?

【问题讨论】:

  • "我们在 this 表中有另一个字段",哪个表?具有原始故障的那个还是您将它们复制到的那个?此外,您应该能够轻松添加 WHERE 子句,通过主键值过滤掉已经存在的行。
  • 在两个表中。没有主键。
  • @Umakant 如果您将表格和一些测试数据与预期输出一起包含在内,可能会有所帮助
  • 然后添加一个主键,在源表中添加它的自动编号/身份,而不是在另一个表中,以便您可以复制源表中生成的值。
  • 任何可能的列组合,使其唯一!!,从两个表中发布示例记录

标签: sql sql-server datetime threshold redundancy


【解决方案1】:

简短的回答,除非您没有指示性列,否则您不能果断地说仪表板表中的两条记录是两个单独的实例或相同。

我建议您使用仪表板表中故障表中的 ID 列。

如果您不想使用 FaultsTBL.IDField,则存储从故障表中提取完成的时间。在从上一次到现在的下一次提取中,依此类推。

总之,您需要一个指标! DateDiff() 也足以替换您现有的 where 条件。最后,仅提取仍然打开和/或在上次提取之后发生的故障。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多