如果我正确理解了您的问题,您希望指定日期/时间的月份部分,同时保持日期和年份相同。
这是一种将当前月份值修改为新值的方法:
DATEADD(month, -DATEPART(month, RateDate) + @Month, RateDate)
上面的代码将减去当前月份,并添加新的月份;基本上取代了日期/时间的月份部分。请注意,这RateDate
是您希望更改月份的列/变量。
上面使用的函数是DATEADD
(将整数值添加/减去日期/时间的特定部分;月、日、年、小时等)和DATEPART
(提取特定的日期/时间部分;月、日、年等) .)。
根据下面的评论,以下是插入该月每一天的信息的方法:
USE xxx
DECLARE @DateToCopy datetime;
DECLARE @Month int;
DECLARE @LastDay int;
DECLARE @CurrentDay int;
SET @DateToCopy = CONVERT(DATETIME, '2011-10-27 00:00:00', 102); -- The date to copy
SET @Month = 09; -- The month
SET @LastDay = DATEPART(day, DATEADD(day, -DATEPART(day, @DateToCopy), DATEADD(month, 1, @DateToCopy)));
BEGIN TRANSACTION
SET @CurrentDay = 1;
WHILE (@CurrentDay <= @Lastday)
BEGIN
INSERT INTO Z_T_CurrencyRate_Test (CurrencyID, RateDate, RateToMain, RateToSec, CurrencyRate)
SELECT
CurrencyID,
DATEADD(month, -DATEPART(month, RateDate) + @Month, DATEADD(day, -DATEPART(day, RateDate) + @CurrentDay, RateDate)), -- important bit!
RateToMain,
RateToSec,
CurrencyRate
FROM T_CurrencyRate
WHERE (RateDate = @DateToCopy);
SET @CurrentDay = @CurrentDay + 1;
END
COMMIT TRANSACTION
这是第一个新的混乱会做的事情:
SET @LastDay = DATEPART(
day,
DATEADD(
day,
-DATEPART(day, @DateToCopy),
DATEADD(month, 1, @DateToCopy)
)
);
从左到右(但是,请注意,由于嵌套,计算是向后发生的):
DATEPART(day, ...)
将提取计算的日期(这将是该月的最后一天)。
DATEADD(day, -DATEPART(day, @DateToCopy), ...)
减去当前天数。
- 例如,
2011-10-27
- 27
= 2011-09-30
。
DATEADD(month, 1, @DateToCopy)
直接跳到下个月,执行 #2 的减法运算。
第二个新混乱:
DATEADD(
month,
-DATEPART(month, RateDate) + @Month,
DATEADD(
day,
-DATEPART(day, RateDate) + @CurrentDay,
RateDate
)
), -- important bit!
同样,从左到右,并向后计算(由于嵌套):
DATEADD(month, ..., ...)
将从中替换月份RateDate
。
-DATEPART(month, RateDate) + @Month
是计算的替换月份。
DATEADD(day, ..., RateDate)
将替换从RateDate
.
-DATEPART(day, RateDate) + @CurrentDay
是计算出的更换日期。