【问题标题】:SQL Server: Adjusting queried date range based on current date and adjust column headers as wellSQL Server:根据当前日期调整查询日期范围并调整列标题
【发布时间】:2015-09-11 21:05:08
【问题描述】:

我有一个查询,要从我们的医疗记录系统中提取特定时间段内提供者看到的患者人数。我想每个月都提取过去一年的数据,包括本月至今。

我可以手动进行查询,但我希望它每月自动调整,以便当前月份是最后一个查询,其他月份是前 11 个月,而无需重做代码中的所有搜索.

理想情况下,我还希望将其输出到我的表格中,并带有相应的月份标题。例如,当表格输出时,本月将列为 9/15 而不是 Month12,这将调整为下个月的 10/15,依此类推。

关于如何完成这两项任务的任何建议?

这是我当前的代码,它运行良好,但必须每个月手动调整:

BEGIN
INSERT INTO #Output (Provider, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12)
OUTPUT inserted.Provider, inserted.Date1, inserted.Date2, inserted.Date3, inserted.Date4, inserted.Date5, inserted.Date6, inserted.Date7, inserted.Date8,
inserted.Date9, inserted.Date10,inserted.Date11, inserted.Date12
select pm.last_name,
  SUM(case when enc_timestamp >= '20141001' and enc_timestamp  < '20141101' then 1 else 0 end) as total_patients_Oct14,
  SUM(case when enc_timestamp >= '20141101' and enc_timestamp  < '20141201' then 1 else 0 end) as total_patients_Nov14,
  SUM(case when enc_timestamp >= '20141201' and enc_timestamp  < '20150101' then 1 else 0 end) as total_patients_Dec14,
  SUM(case when enc_timestamp >= '20150101' and enc_timestamp  < '20150201' then 1 else 0 end) as total_patients_Jan15,
  SUM(case when enc_timestamp >= '20150201' and enc_timestamp  < '20150301' then 1 else 0 end) as total_patients_Feb15,
  SUM(case when enc_timestamp >= '20150301' and enc_timestamp  < '20150401' then 1 else 0 end) as total_patients_Mar15,
  SUM(case when enc_timestamp >= '20150401' and enc_timestamp  < '20150501' then 1 else 0 end) as total_patients_April15,
  SUM(case when enc_timestamp >= '20150501' and enc_timestamp  < '20150601' then 1 else 0 end) as total_patients_May15,
  SUM(case when enc_timestamp >= '20150601' and enc_timestamp  < '20150701' then 1 else 0 end) as total_patients_June15,
  SUM(case when enc_timestamp >= '20150701' and enc_timestamp  < '20150801' then 1 else 0 end) as total_patients_July15,
  SUM(case when enc_timestamp >= '20150801' and enc_timestamp  < '20150901' then 1 else 0 end) as total_patients_Aug15,
  SUM(case when enc_timestamp >= '20150901' and enc_timestamp  < '20151001' then 1 else 0 end) as Total_Charge_Sep15
from patient_encounter pe
inner join provider_mstr pm ON pe.rendering_provider_id = pm.provider_id
where enc_timestamp >= '20140101' and enc_timestamp  < '20160101' and billable_ind = 'Y' and checkin_datetime is not NULL
group by pm.last_name
END

【问题讨论】:

    标签: sql-server date datetime


    【解决方案1】:

    方法 DATEADD 是你的朋友:

    编辑:自动获取当前月份的第一天作为 ReferenceDate: EDIT2:将参考日期设置回一年。

    DECLARE @ReferenceDate DATETIME=CAST(YEAR(GETDATE())-1 AS VARCHAR(4))+REPLACE(STR(MONTH(GETDATE()),2),' ','0')+'01';
    

    这是你改编的代码:

    BEGIN
    INSERT INTO #Output (Provider, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12)
    OUTPUT inserted.Provider, inserted.Date1, inserted.Date2, inserted.Date3, inserted.Date4, inserted.Date5, inserted.Date6, inserted.Date7, inserted.Date8,
    inserted.Date9, inserted.Date10,inserted.Date11, inserted.Date12
    select pm.last_name,
      SUM(case when enc_timestamp >= @ReferenceDate and enc_timestamp  < DATEADD(MONTH,1,@ReferenceDate) then 1 else 0 end) as total_patients_Oct14,
      SUM(case when enc_timestamp >= DATEADD(MONTH,1,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,2,@ReferenceDate) then 1 else 0 end) as total_patients_Nov14,
      SUM(case when enc_timestamp >= DATEADD(MONTH,2,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,3,@ReferenceDate) then 1 else 0 end) as total_patients_Dec14,
      SUM(case when enc_timestamp >= DATEADD(MONTH,3,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,4,@ReferenceDate) then 1 else 0 end) as total_patients_Jan15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,4,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,5,@ReferenceDate) then 1 else 0 end) as total_patients_Feb15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,5,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,6,@ReferenceDate) then 1 else 0 end) as total_patients_Mar15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,6,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,7,@ReferenceDate) then 1 else 0 end) as total_patients_April15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,7,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,8,@ReferenceDate) then 1 else 0 end) as total_patients_May15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,8,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,9,@ReferenceDate) then 1 else 0 end) as total_patients_June15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,9,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,10,@ReferenceDate) then 1 else 0 end) as total_patients_July15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,10,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,11,@ReferenceDate) then 1 else 0 end) as total_patients_Aug15,
      SUM(case when enc_timestamp >= DATEADD(MONTH,11,@ReferenceDate) and enc_timestamp  < DATEADD(MONTH,12,@ReferenceDate) then 1 else 0 end) as Total_Charge_Sep15
    from patient_encounter pe
    inner join provider_mstr pm ON pe.rendering_provider_id = pm.provider_id
    where enc_timestamp >= @ReferenceDate and enc_timestamp  < DATEADD(YEAR,2,@ReferenceDate) and billable_ind = 'Y' and checkin_datetime is not NULL
    group by pm.last_name
    END
    

    【讨论】:

    • @Reid,哦,对不起,我没有看到你的“也调整列标题”......这是用“普通”SQL 做不到的。有两种方法:动态 SQL(意味着在 VARCHAR 变量中构建整个语句,您可以在其中设置列的名称,并使用 EXEC 执行此操作。更好(至少在我看来)将列设置为未指定名称 (month1,month2,...) 并在您的 GUI 中进行命名。
    • @Reid,很高兴为您提供帮助!如果您喜欢这个答案,请点赞并接受。所有回答者都渴望获得声誉积分:-)
    • 看起来这是为了先创建当前月份,然后再添加未来月份!我认为它应该盯着 DATEADD(MONTH,-11)@ReferenceDate) 作为第一列,然后向下工作到 -10、-9 等,直到你得到 @ReferenceDate?
    • @Reid,是的,感谢您指出这一点......一切都取决于 ReferenceDate。只需将其设置回一年就可以了,我会在一秒钟内编辑我的答案...
    • @Reid,完成!您只需在年份或月份部分添加一个常量即可“移动”参考日期...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多