在日期内设置参数

时间:2013-04-22 23:35:40

标签: sql-server datetime

我正在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

2 个答案:

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

从左到右(但请注意,由于嵌套,计算会向后发生):

  1. DATEPART(day, ...)将提取计算的日期(将是该月的最后一天)。
  2. DATEADD(day, -DATEPART(day, @DateToCopy), ...)减去当前天数。
    • 例如,2011-10-27 - 27 = 2011-09-30
  3. DATEADD(month, 1, @DateToCopy)只是跳到下个月,从#2执行减法。
  4. 第二个新的混乱:

    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. 中的那一天
    5. -DATEPART(day, RateDate) + @CurrentDay计算的替换日期。

答案 1 :(得分:0)

您希望每次 不同。您只需要执行以下操作:

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

您只需要concatenate