Вы можете сыграть несколько забавных трюков с DATEADD
/ DATEDIFF
:
create table T (
ID int not null,
DT date not null
)
insert into T (ID,DT)
select 1,'20100115' union all
select 2,'20100214' union all
select 3,'20100314' union all
select 4,'20100415'
SELECT ID,DATEADD(month,DATEDIFF(month,'20100101',DT),'20100115')
from T
SELECT ID,DATEADD(month,DATEDIFF(month,'20100101',DT),'20100130')
from T
Результаты:
ID
----------- -----------------------
1 2010-01-15 00:00:00.000
2 2010-02-15 00:00:00.000
3 2010-03-15 00:00:00.000
4 2010-04-15 00:00:00.000
ID
----------- -----------------------
1 2010-01-30 00:00:00.000
2 2010-02-28 00:00:00.000
3 2010-03-30 00:00:00.000
4 2010-04-30 00:00:00.000
Как правило, в DATEADD / DATEDIFF вы указываете один и тот же компонент для обоих (т.е. месяц). Затем вторая константа даты (то есть «20100130») указывает «смещение», которое вы хотите применить с первой даты (то есть «20100101»), которое будет «перезаписывать» часть даты, которую вы не храните. Мой обычный пример - когда вы хотите удалить часть времени из значения datetime:
SELECT DATEADD(day,DATEDIFF(day,'20010101',<date column>),'20100101')