如何计算本月患者被录取的天数



我需要生成MS SQL Server查询以计算患者本月被录取的天数患者可能已经入院了几个月。

我试图使用日期夫来计算天数,但只能获得从入院到出院或当前日期的总数。

我有一个包含入学详细信息的表:

患者入学日期排出病房

示例:

  • 患者于2019年1月1日入院
  • 患者于2019年10月10日出院
  • 报告的报告将于2月举行,并将返回患者被送入28天至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

您需要考虑几个条件才能找到几天的差异,这就是为什么我使用嵌套的案例语句检查它们的原因。
我使用 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

请参阅演示

最新更新