SQL Server存储过程将datepart year作为参数传递

时间:2016-11-04 17:08:59

标签: sql sql-server sql-server-2008 datetime datepart

我想知道是否有人可以帮忙,我已经得到了以下程序,我试图启用它,以便最终用户只能通过日期的年份部分,它将基于查询关于该参数,所以目前我在ContractDate.ContractDate >= 01/01/2015 AND <= 31/12/2015之间查询,但我希望我们的用户能够进入2016年&#39;例如,作为传递的参数进入文本框,并将更新上述标准的年份部分,基于此查询,但保留月和日部分,这样他们就可以进入

对于sql来说,我是一个相当新手的人,所以很高兴得到任何帮助。

SELECT TOP 100 PERCENT 
    dbo.Users.LoginName, 
    CAST(DATENAME(m, dbo.ContractDate.ContractDate) AS varchar) AS DatePeriod, 
    SUM(CASE WHEN dbo.Contract.Contract = 1 THEN 1 ELSE 0 END) AS Contract, 
    SUM(CASE WHEN dbo.contract.contract = 0 THEN 1 ELSE 0 END) AS Permanent
FROM
    dbo.ContractSkill 
INNER JOIN
    dbo.Users 
INNER JOIN
    dbo.Contract ON dbo.Users.UserId = dbo.Contract.UserId   
INNER JOIN
    dbo.ContractDate ON dbo.Contract.ContractId =   dbo.ContractDate.ContractId 
    ON dbo.ContractSkill.ContractId = dbo.Contract.ContractId
WHERE        
    (dbo.ContractDate.DNS = 0) 
    AND (dbo.ContractSkill.SkillId = 30960)    
    AND (dbo.ContractDate.ContractDate >= CONVERT(DATETIME, '2015-01-01  00:00:00', 102)) 
    AND (dbo.ContractDate.ContractDate <= convert(DATETIME, '2015-12-31 00:00:00', 102))
GROUP BY 
    CAST(DATENAME(m, dbo.ContractDate.ContractDate) AS varchar),
    MONTH(dbo.ContractDate.ContractDate), dbo.Users.LoginName
    ORDER BY MONTH(dbo.ContractDate.ContractDate)

2 个答案:

答案 0 :(得分:1)

首先,如果您能以更易读的方式发布代码,那么评论者(当然是我)会非常感激。

其次,如果您的意思是要在函数中添加一个参数,通过该函数提供所选年份,则只需添加该参数即可:

  1. 声明要在select语句中使用的两个变量,其类型为DATE

  2. 添加以下作业:

    SET @YourStartVariable = CONVERT(DATETIME,CONCAT(P_Passed_Year,'-01-01 00:00:00'),102);
    SET @YourEndtVariable  = CONVERT(DATETIME,CONCAT(P_Passed_Year,'-31-12 23:59:59'),102);
    
  3. 在查询中使用这些变量,而不是:

    (dbo.ContractDate.ContractDate >= CONVERT(DATETIME,'2015-01-01 00:00:00', 102))
    AND (dbo.ContractDate.ContractDate <= convert(DATETIME,'2015-12-31 00:00:00', 102))
    
    你会得到:

    (dbo.ContractDate.ContractDate >=  @YourStartVariable)
    AND (dbo.ContractDate.ContractDate <=  @YourEndVariable)
    
  4. 那就是。

    您的原始上限是YYYY-12-31 00:00:00,我猜测它应该是YYYY-12-31 23:59:59

答案 1 :(得分:1)

有两种方法可以实现这个目标。

第一个非常简单,只传递一年的参数

@Contract_Year tityint

然后使用函数Year()放置where条件。

Where Year(dbo.Contract.ContractDate) = @Contract_Year

第二个是为From Date和To Date创建两个单独的变量。

如果您在ContractDate字段上创建了索引,我建议您使用此方法。如果您使用任何函数内的字段(即。Year(),Month()或Day()),则不会考虑B&#39; coz,index。

<强> Paremter

@Contract_Year Char(4)

存储过程代码

Declare @from_Date DateTime = Cast(@Contract_Year + '-01-01' As DateTime);
Declare @to_Date DateTime = Cast(@Contract_Year + '-12-31 23:59:59' As DateTime);

在Where子句中使用上述变量

Where (dbo.Contract.ContractDate Between @from_Date and @to_Date)