1

SQL Server で、データを挿入するスクリプトを作成しています (DUH)。

私の問題は、日付の MONTH (太字のもの) を毎回別の月に設定する必要があることです。

「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
4

2 に答える 2

2

私があなたの質問を正しく理解していれば、を同じに保ちながら、日付/時刻の月の部分を指定する必要があります。

現在の月の値を新しい値に変更する方法は次のとおりです。

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)
                                )
                       );

左から右へ (ただし、入れ子になっているため、計算が逆方向に行われることに注意してください):

  1. DATEPART(day, ...)計算された日 (月の最終日) を抽出します。
  2. DATEADD(day, -DATEPART(day, @DateToCopy), ...)現在の日数を減算します。
    • 例: 2011-10-27- 27= 2011-09-30.
  3. DATEADD(month, 1, @DateToCopy)単純に次の月にジャンプして、# 2 からの減算を実行します。

そして2番目の新しい混乱:

DATEADD(
         month,
         -DATEPART(month, RateDate) + @Month,
         DATEADD(
                  day,
                  -DATEPART(day, RateDate) + @CurrentDay,
                  RateDate
                )
       ), -- important bit!

繰り返しますが、左から右に、逆方向に計算されます (ネスティングのため):

  1. DATEADD(month, ..., ...)は からの月を置き換えRateDateます。
  2. -DATEPART(month, RateDate) + @Monthは交換月の計算値です。
  3. DATEADD(day, ..., RateDate)からの日替わりですRateDate
  4. -DATEPART(day, RateDate) + @CurrentDay計算された交換日です。
于 2013-04-22T23:48:41.943 に答える
0

が毎回違うようにしたいだけです。次のようにするだけです。

SELECT CurrencyID, 
CONVERT(DATETIME, '2011-'+ @Month+'-27 00:00:00', 102), RateToMain, 
RateToSec, CurrencyRate 
FROM T_CurrencyRate

あなたはただする必要がありconcatenateます。

于 2013-04-23T05:15:36.270 に答える