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 的减法运算。

第二个新混乱:

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 回答