我正在SQL Server中编写一个应插入一些数据(DUH)的脚本。
我的问题是,每次到不同月份时,必须设置日期的月份(粗体)。
它应该像'2011- @ month-27',但当然不行。
这是脚本:
USE xxx
DECLARE @Month int;
DECLARE @DateToCopy datetime;
SET **@Month = 09** -- The month
SET @DateToCopy = CONVERT(DATETIME, '2011-10-27 00:00:00', 102) -- The date to copy
BEGIN TRANSACTION
INSERT INTO Z_T_CurrencyRate_Test (CurrencyID, RateDate, RateToMain, RateToSec, CurrencyRate)
SELECT CurrencyID, **CONVERT(DATETIME, '2011-10-27 00:00:00', 102)**, RateToMain, RateToSec, CurrencyRate
FROM T_CurrencyRate
WHERE (RateDate = @DateToCopy)
COMMIT TRANSACTION
答案 0 :(得分:2)
如果我正确理解了您的问题,您需要指定日期/时间的月部分,同时保留天和年相同。
这是一种将当前月份值修改为新月份的方法:
DATEADD(month, -DATEPART(month, RateDate) + @Month, RateDate)
以上代码将减去当前月份,添加新月份;基本上替换日期/时间的月部分。请注意,RateDate
是您希望其月份更改的列/变量。
上面使用的函数是DATEADD
(在日期/时间的特定部分添加/减去整数值;月,日,年,小时等)和DATEPART
(提取具体日期/时间部分;月,日,年等)。
根据comment below,这里有如何插入每月每天的信息:
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
是计算的替换日期。答案 1 :(得分:0)
您希望每次月 不同。您只需要执行以下操作:
SELECT CurrencyID,
CONVERT(DATETIME, '2011-'+ @Month+'-27 00:00:00', 102), RateToMain,
RateToSec, CurrencyRate
FROM T_CurrencyRate
您只需要concatenate
。