计算同一列中两个日期之间的差异

时间:2015-01-27 23:32:38

标签: sql sql-server-2008 date diff

我有一个叫做交易的表。我希望能够测量cmnt_cre_dates之间的天数。

表格如下所示

pt_id   name              trans_cmnt    pt_loc  last_bl_date cmnt_cre_date
94578   RAMIREZ , JOHN    Trans 130     S       1/8/2015     1/8/2015
94578   RAMIREZ , JOHN    Trans 146     S       1/8/2015     1/9/2015
94578   RAMIREZ , JOHN    Trans 380     S       1/8/2015     1/13/2015
94578   RAMIREZ , JOHN    Trans 344     S       1/8/2015     1/15/2015
54678   KIFLE ,LOLA       Trans 146     S       1/16/2015    1/16/2015
54678   KIFLE ,LOLA       Trans 230     S       1/16/2015    1/16/2015
12547   WEISS ,Jenny      Trans 230     S       1/26/2015    1/26/2015
12711   FARRELL ,DIVINA   Trans 230     S       1/14/2015    1/14/2015
12711   JOHNS ,NATIVIDAD  Trans 230     S       1/23/2015    1/13/2015
12711   JOHNS ,NATIVIDAD  Trans 230     S       1/23/2015    1/23/2015

我希望桌子看起来像这样:

pt_id   name             trans_cmnt pt_loc last_bl_date cmnt_cre_date   diff_days
94578   RAMIREZ , JOHN   Trans 130  S      1/8/2015     1/8/2015         0
94578   RAMIREZ , JOHN   Trans 146  S      1/8/2015     1/9/2015         1
94578   RAMIREZ , JOHN   Trans 380  S      1/8/2015     1/13/2015        4
94578   RAMIREZ , JOHN   Trans 344  S      1/8/2015     1/15/2015        2
54678   KIFLE ,LOLA      Trans 146  S      1/16/2015    1/16/2015        0
54678   KIFLE ,LOLA      Trans 230  S      1/16/2015    1/16/2015        0
12547   WEISS ,Jenny     Trans 230  S      1/26/2015    1/26/2015        0
12711   FARRELL ,DIVINA  Trans 230  S      1/14/2015    1/14/2015        0
12711   JOHNS ,NATIVIDAD Trans 230  S      1/23/2015    1/13/2015        0
12711   JOHNS ,NATIVIDAD Trans 230  S      1/23/2015    1/23/2015       10

我如何在sql中执行此操作?

2 个答案:

答案 0 :(得分:0)

如果我理解正确的话......

update your_table current set diff_days = 
 cmnt_cre_date - (select max(cmnt_cre_date) from your_table 
                  where cmnt_cre_date < current.cmnt_cre_date
                  and name = current.name) ;

update your_table set diff_days = 0 where diff_days is null;

上面是postgres,因为你没有指定你正在使用哪个数据库。

答案 1 :(得分:0)

你可以一起工作

SELECT
  T.pt_id
  , T.name
  , T.trans_cmnt
  , T.pt_loc
  , T.last_bl_date
  , T.cmnt_cre_date
  , ISNULL(DATEDIFF(day,
                    (SELECT MAX(cmnt_cre_date)
                     FROM Transactions
                     WHERE name = T.name AND cmnt_cre_date < T.cmnt_cre_date),
                    cmnt_cre_date),
           0) diff_days
FROM Transactions T
;

请记住:如果您没有提供ORDER BY条款,则不能依赖于按特定顺序返回的记录。

如果需要调整/进一步详细说明,请发表评论。