私があなたの質問を正しく理解していれば、日と年を同じに保ちながら、日付/時刻の月の部分を指定する必要があります。
現在の月の値を新しい値に変更する方法は次のとおりです。
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 からの減算を実行します。
そして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計算された交換日です。