我想知道是否有人可以帮忙,我已经得到了以下程序,我试图启用它,以便最终用户只能通过日期的年份部分,它将基于查询关于该参数,所以目前我在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)
答案 0 :(得分:1)
首先,如果您能以更易读的方式发布代码,那么评论者(当然是我)会非常感激。
其次,如果您的意思是要在函数中添加一个参数,通过该函数提供所选年份,则只需添加该参数即可:
声明要在select语句中使用的两个变量,其类型为DATE
,
添加以下作业:
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);
在查询中使用这些变量,而不是:
(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)
那就是。
您的原始上限是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)