日期差异在SQL Server中使用LAG函数时更改为42000

时间:2018-04-11 05:41:24

标签: sql sql-server

问题:对于特定患者,在接下来的7天内不会对呼叫进行后续预约

我的查询:

  select *, DATEDIFF(DAY, (APPOINTMENT_DATE - LAG(APPOINTMENT_DATE) 
  over (ORDER BY PATIENT_ID)), APPOINTMENT_DATE) as DIFFERENCE from [dbo]. 
  [Appointment Data]

问题:

1.由于日期时间的原因,某些疯狂格式的差异可能会改变。

2.我的查询对吗?如何找到每个客户的差异?我知道我必须申请分组,但我有点困惑。

PLS帮助!

数据集:

APPOINTMENT_DATE             PATIENT_ID         DIFFERENCE                                                  

2010-05-06 00:00:00.000      00051101          NULL
2010-04-11 00:00:00.000      00101005          40302
2010-05-06 00:00:00.000      00130521          40277
2010-02-07 00:00:00.000      00130521          40302

2 个答案:

答案 0 :(得分:0)

select *,
DATEDIFF(DAY, LAG(APPOINTMENT_DATE) over (ORDER BY PATIENT_ID), APPOINTMENT_DATE) as DIFFERENCE
from [dbo].[Appointment Data]

结果:

+-----------------------+------------+------------+
|   APPOINTMENT_DATE    | PATIENT_ID | DIFFERENCE |
+-----------------------+------------+------------+
| 5/6/2010 12:00:00 AM  |   00051101 |       null |
| 4/11/2010 12:00:00 AM |   00101005 |        -25 |
| 5/6/2010 12:00:00 AM  |   00130521 |         25 |
| 2/7/2010 12:00:00 AM  |   00130521 |        -88 |
+-----------------------+------------+------------+

如果您切换日期,结果会有所不同。

select *,
DATEDIFF(DAY, APPOINTMENT_DATE, LAG(APPOINTMENT_DATE) over (ORDER BY PATIENT_ID)) as DIFFERENCE
from [dbo].[Appointment Data]

结果:

+-----------------------+------------+------------+
|   APPOINTMENT_DATE    | PATIENT_ID | DIFFERENCE |
+-----------------------+------------+------------+
| 5/6/2010 12:00:00 AM  |   00051101 |       null |
| 4/11/2010 12:00:00 AM |   00101005 |         25 |
| 5/6/2010 12:00:00 AM  |   00130521 |        -25 |
| 2/7/2010 12:00:00 AM  |   00130521 |         88 |
+-----------------------+------------+------------+

答案 1 :(得分:0)

您的查询中似乎有多处错误:

1)您应该在分区中使用列PATIENT_ID,并在APPOINTMENT_DATE函数中按LAG排序

2)您在DATEDIFF函数

中有不必要的减法

因此,您的查询应该是:

select 
    *, datediff(dd, lag(APPOINTMENT_DATE) over (partition by PATIENT_ID order by APPOINTMENT_DATE), APPOINTMENT_DATE)
from 
    [dbo].[Appointment Data]