我需要生成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
请参阅演示