SQL - “重复”记录,但在同一天内具有不同的日期和

时间:2012-06-04 22:26:03

标签: sql-server

我们遇到的问题是在线支付网关系统有时会在几分钟内复制交易条目。

我们想要创建这些交易的记录,以便我们分析和纠正它们。

单表,如下。这仅显示一个卡号的结果。我们宁愿只返回在同一天发生的交易,最好在5秒内返回与最后两行相同的交易。

txn_authcode   card_number   cardtype   txn_status   txn_value   entryTimeStamp
-------------------------------------------------------------------------------
1491109220     ....0279      Visa       FAILED       20.00       2011-06-24 19:49:00
1491109219     ....0279      Visa       FAILED       20.00       2012-05-28 22:47:57
1491109218     ....0279      Visa       FAILED       20.00       2012-05-28 22:46:39
1491109217     ....0279      Visa       FAILED       20.00       2012-05-28 22:46:35

到目前为止,我有以下内容,它会获得给定卡号的重复记录,但我不确定如何进一步将其进行粒化,以便在同一天,最好是在彼此的5秒内获得记录。

        select * from(
            select  t1.txn_authcode,t1.txn_status,t1.txn_value,t1.entryTimeStamp
                from    transactions t1
                where 1=1
                and exists
                (select null
                 from   transactions t2
                 where  t1.card_number = t2.card_number
                 and t1.entryTimeStamp <> t2.entryTimeStamp
                 and t2.entryTimeStamp >= '2012-05-01'
                 and t2.entryTimeStamp <= '2012-06-01'
                 --*** AND DATEDIFF ( day , t1.entryTimeStamp , t2.entryTimeStamp ) < 1 
    --(datediff above doesn't work as it can return a single record for a given card, 
--but we only want records that have at least one other transaction record on the same 
--day for the same card)

                 )
                 and t1.entryTimeStamp >= '2012-05-01'
                 and t1.entryTimeStamp <= '2012-06-01'
             )x
        order by card_number,entryTimeStamp desc

有人可以帮我一把吗?

2 个答案:

答案 0 :(得分:3)

...
AND DATEDIFF ( day , t1.entryTimeStamp , t2.entryTimeStamp ) < 1
AND t1.txn_authcode < t2.txn_authcode
...

使用上述声明替换已注释的查询部分,您应该得到所需内容。

答案 1 :(得分:3)

如果您需要几秒钟,请使用

AND DATEDIFF ( ss, t1.entryTimeStamp , t2.entryTimeStamp ) < 5

如果您只需要当天,请使用

SQL Server 2008或更高版本

AND CONVERT(date,t1.entryTimeStamp) = convert(date,t2.entryTimeStamp)

SQL Server 2005或更早版本

and convert(char(10),t1.entryTimeStamp,101) = convert(char(10),t2.entryTimeStamp,101)

如果您需要两者,请使用组合。