如何计算患者本月入院的天数

时间:2019-02-18 16:25:30

标签: sql sql-server

我需要生成一个MS SQL Server查询来计算患者当月入院的天数,但是当患者可能已经入院前几个月时,我遇到的问题是如何解决此问题

我尝试使用DATEDIFF来计算天数,但是如果尚未释放,则只能获得从入院到出院的总天数,或者只有当前日期。

我有一张包含入场详细信息的表:

PatientID 入学日期 卸货日期 WardID

示例:

  • 患者于2019年1月1日入住
  • 患者于2019年10月3日出院
  • 报告运行于2月,返回的结果是直到2月28日才收治患者。

2 个答案:

答案 0 :(得分:2)

您需要以仅考虑自所需月份起的几天限制DATEDIFF的方式。您可以使用CASE来做到这一点。

DECLARE @PatientInfo TABLE (
    AdmissionDate DATE,
    DischargeDate DATE)

INSERT INTO @PatientInfo (
    AdmissionDate,
    DischargeDate)
VALUES
    ('2019-01-01', '2019-03-10'),
    ('2019-02-15', '2019-02-17'),
    ('2019-02-25', '2019-05-01'),
    ('2019-01-05', '2019-01-06')

DECLARE @YearFilter INT = 2019
DECLARE @MonthFilter INT = 2 -- 2: February

DECLARE @StartOfMonth DATE = DATEFROMPARTS(@YearFilter, @MonthFilter, 1)
DECLARE @EndOfMonth DATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, @StartOfMonth))

SELECT
    P.*,
    FilteredMonthDays = 1 + DATEDIFF(
        DAY,
        CASE WHEN P.AdmissionDate < @StartOfMonth THEN @StartOfMonth ELSE P.AdmissionDate END,
        CASE WHEN P.DischargeDate > @EndOfMonth THEN @EndOfMonth ELSE P.DischargeDate END)
FROM
    @PatientInfo AS P
WHERE
    @MonthFilter BETWEEN MONTH(P.AdmissionDate) AND MONTH(P.DischargeDate)

结果:

AdmissionDate   DischargeDate   FilteredMonthDays
2019-01-01      2019-03-10      28
2019-02-15      2019-02-17      3
2019-02-25      2019-05-01      4

答案 1 :(得分:0)

您需要考虑多种条件才能找到天数差异,这就是为什么我使用嵌套的case语句检查它们的原因。
我使用dateadd(mm, datediff(mm, 0, getdate()), 0)来获取当前月份的第一天。

select 
  p.patientid, 
  case 
    when discharged < dateadd(mm, datediff(mm, 0, getdate()), 0) then -1
    else datediff(day, 
      case month(admitted) 
        when month(getdate()) then admitted
        else dateadd(mm, datediff(mm, 0, getdate()), 0)
      end,
      case 
        when discharged is null or discharged > getdate() then getdate()
        else discharged
      end
     )  
  end + 1 daysincurmonth  
from patients p

请参见demo