我是SQL Server的新手。我正在尝试创建一个存储过程,您可以在两个日期之间进行搜索。我希望我的EXEC读取类似
的内容EXEC Procedure TimeSheetIndexSearch (Date, Date)
(在这种情况下,您在运行EXEC之前输入日期。
CREATE PROCEDURE TimesheetIndexSearch
AS
SELECT
Timesheets.Hours AS Hours,
Timesheets.DateWorked AS DateWorked,
Timesheets.Description AS Description,
Timesheets.Id AS Id,
Users.Name AS UserName,
Projects.Name AS ProjectName
FROM
Timesheets
INNER JOIN
Users ON Timesheets.UserId = Users.Id
INNER JOIN
Projects ON Timesheets.ProjectId = Projects.Id;
只有一个日期列(没有begindate或enddate)。我使用Where
吗?还是Order By
?谢谢!
答案 0 :(得分:3)
你走了:
CREATE PROCEDURE TimesheetIndexSearch (@Start DATETIME, @End DATETIME)
AS
SELECT Timesheets.Hours AS Hours
, Timesheets.DateWorked AS DateWorked
, Timesheets.Description AS Description
, Timesheets.Id AS Id
, Users.Name AS UserName
, Projects.Name AS ProjectName
FROM Timesheets
INNER JOIN Users ON Timesheets.UserId = Users.Id
INNER JOIN Projects ON Timesheets.ProjectId = Projects.Id
WHERE Timesheets.DateWorked >= @Start
AND Timesheets.DateWorked <= @End;
您还可以使用关键字between
,如下所示:
WHERE Timesheets.DateWorked BETWEEN @Start AND @End
请注意between
,因为它包含变量中的日期,第一种方法更清晰,更容易被所有人阅读。
要运行proc,请使用
EXEC TimesheetIndexSearch '2015-01-01','2015-01-10'
答案 1 :(得分:2)
不要为此创建存储过程。创建存储的函数。这更加通用,因为您可以在from
的{{1}}子句中使用它:
select
然后您可以将其用作:
CREATE FRUN TimesheetIndexSearch (
@Start date,
@End date
)
RETURNS table
AS
RETURN (SELECT ts.Hours AS Hours, ts.DateWorked AS DateWorked,
ts.Description AS Description,
ts.Id AS Id, u.Name AS UserName, p.Name AS ProjectName
FROM Timesheets ts INNER JOIN
Users u
ON ts.UserId = u.Id INNER JOIN
Projects p
ON ts.ProjectId = p.Id
WHERE ts.DateWorked >= @Start AND ts.DateWorked <= @End
);
另外,请注意表别名的使用如何使查询更容易编写和阅读。