更新日期列表以包含同一天

时间:2010-11-02 09:50:43

标签: sql tsql

我在表格中有这个

TempTable
Id    Date
 1    1-15-2010
 2    2-14-2010
 3    3-14-2010
 4    4-15-2010

我想改变每一条记录,以便它们在同一天,也就是第15天 像这样

TempTable
Id    Date
 1    1-15-2010
 2    2-15-2010 <--change to 15
 3    3-15-2010 <--change to 15
 4    4-15-2010
如果我喜欢30号怎么办? 记录应

TempTable
Id    Date
 1    1-30-2010
 2    2-28-2010 <--change to 28 because feb has 28 days only
 3    3-30-2010 <--change to 30
 4    4-30-2010

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用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')申请的“抵消”,这将“覆盖”您未保留的日期部分。我通常的例子是希望从日期时间值中删除时间部分:

SELECT DATEADD(day,DATEDIFF(day,'20010101',<date column>),'20100101')

答案 1 :(得分:0)

您也可以尝试类似

的内容
UPDATE TempTable
SET [Date] = DATEADD(dd,15-day([Date]), DATEDIFF(dd,0,[Date]))

我们有一个计算一个月第一天的函数,所以我只是加上它来计算15而不是......