SQL查找数据集的月份的第一天

时间:2017-03-06 21:39:13

标签: sql sql-server date

我发现很多代码让sql显示一个月的第一天,但​​是我需要根据我的数据集显示一个月的第一天[month] 1st [year]

EX 1:1月1日是假日,所以它永远不会是数据集中月份的第一天,1月的第一天是1月2日。 另一个例子是如果月份的第一个日期是我的数据集中的第7个,我希望看到第7个而不是第1个。

这是我的数据集

DATE
----------
2016-02-01
2016-02-05
2016-02-08
2016-02-19
2016-02-20
2016-02-22
2016-05-02
2016-05-05
2016-05-07
2016-05-09
2016-05-11
2016-05-23
2016-06-01    
2016-06-10
2016-06-20
2016-06-29
2016-07-01   
2016-07-07 
2016-07-14 
2016-07-21 
2016-07-28 
2016-07-31 
2016-08-04 
2016-08-10 
2016-08-18 
2017-02-23 
2017-02-30 

我需要这个才能显示

DATE
----------
2016-02-01
2016-05-02
2016-06-01    
2016-07-01   
2016-08-04 
2017-02-23 

我一直陷入困境,我认为这可能有用,但我没有得到那个月的最短约会

select min(load_date) from multi_dt
group by month(load_date)

3 个答案:

答案 0 :(得分:1)

试试这个:

select min(load_date) as min_load_date
from multi_dt
group by  dateadd(month, datediff(month, 0, load_date )  , 0)

使用month()仅返回月份,但使用上面查询中的函数将返回该月的第一个,但是作为datetime数据类型,因此当您按其分组时,它包括年和月。

rextester演示:http://rextester.com/UJRN68337

返回:

+---------------+
| min_load_date |
+---------------+
| 2016-02-01    |
| 2016-05-02    |
| 2016-06-01    |
| 2016-07-01    |
| 2016-08-04    |
| 2017-02-23    |
+---------------+

答案 1 :(得分:0)

我会使用row_number()

select t.date
from (select t.*,
             row_number() over (partition by year(date), month(date) order by date) as seqnum
      from t
     ) t
where seqnum = 1;

如果您不需要任何其他列,则聚合将是等效的:

select min(t.date)
from t
group by year(t.date), month(t.date);

答案 2 :(得分:0)

您的初步答案很好,您还需要按年份分组。

group by
month(load_date),year(load_date)