在SQL Server 2014中创建一个存储过程,该存储过程介于两个日期

时间:2015-08-07 14:27:23

标签: sql sql-server stored-procedures sql-server-2014

我是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?谢谢!

2 个答案:

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

另外,请注意表别名的使用如何使查询更容易编写和阅读。

相关问题