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