【问题标题】:Getting a snapshot on the first day of the each month在每个月的第一天获取快照
【发布时间】:2018-01-11 01:49:48
【问题描述】:

我的数据集如下所示:

emplid region location sub_dept dept start_dt end_dt     days
------ ------ -------- -------- ---- -------- ---------- ----
123456 East   NY       A           1 7/1/2005 9/30/2005    91
123456 East   NY       B           1 7/1/2012 11/9/2012   131
123456 West   San Jose C           2 7/1/2013 12/31/2013  183
123457 East   NY       B           1 7/1/2017 9/7/2017     68
123457 East   NY       B           1 7/1/2005 12/31/2005  183
123458 East   NY       B           1 7/1/2017 9/7/2017     68
123458 West   San Jose C           2 7/1/2010 7/31/2010    30
123459 East   NY       A           1 7/1/2017 9/7/2017     68
123460 East   Boston   F           3 7/1/2007 11/30/2007  152

我需要能够从最短日期开始每月的第一天获取快照。所以在示例中,最小日期是9/30/2005。所以我需要知道在最大日期之前10/1/2005, 11/1/2005 , 12/1/2005 上的每个 department/sub_dept/location/region 是哪个 empl。

【问题讨论】:

  • 有了这些样本数据,预期的结果是什么? (作为格式化文本,适当的列。)
  • 预期结果是上述所有列加上每个月的第一天的 1st_day 列

标签: sql oracle date plsql calendar


【解决方案1】:

试试这个查询:

 Declare @StartDate date='2005-09-29',
 @EndDate date='2017-04-01'

Select *,
Dateadd(mm, Datediff(mm, 0, date), 0) AS FirstDateOfMonth  from TableName
where   date >=@StartDate and date<=@EndDate

【讨论】:

    【解决方案2】:

    您没有提到员工表的名称,所以我将其命名为employee_table。以下查询(或非常接近的查询)应该会生成您想要的内容:

    With report_limits as (
          Select Trunc(min(start_dt), 'MONTH') as min_rpt_dt, 
                 Trunc(max(end_dt), 'MONTH') as max_rpt_dt 
            From employee_table),
         report_dates as (
          Select add_months(min_rpt_dt, level-1) as rpt_dt
            From report_limits 
         Connect By add_months(min_rpt_dt, level-1) <= max_rpt_dt)
    --
    Select e.emplid, e.region, e.location, e.sub_dept, e.dept,
           e.start_dt, e.end_dt, e.days, r.rpt_dt
    From report_dates r
    Inner Join employee_table e on r.rpt_dt Between e.start_dt And e.end_dt
    Order By r.rpt_dt, e.emplid;
    

    report_limits 查询确定报告日期的范围,report_dates 查询使用 Connect By 子句生成范围内的一组日期,主查询将日期列表连接到员工日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2021-06-11
      • 2019-03-04
      • 2020-10-02
      • 2013-02-14
      相关资源
      最近更新 更多