我需要生成一个MS SQL Server查询来计算患者当月入院的天数,但是当患者可能已经入院前几个月时,我遇到的问题是如何解决此问题
我尝试使用DATEDIFF来计算天数,但是如果尚未释放,则只能获得从入院到出院的总天数,或者只有当前日期。
我有一张包含入场详细信息的表:
PatientID 入学日期 卸货日期 WardID
示例:
答案 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