1

我有一个用于搜索申请人的存储过程,如下所示:

 /*  
AUTHOR   :   
CREATION DATE  :      
NOTES   :  
PURPOSE   :   
MODIFIED BY  :  
MODIFICATION DATE :  
*/  
ALTER PROCEDURE USP_GET_ApplicantByFilter  
(  
 @ApplicantName  VARCHAR(100)='Ram',  
 @AgeFrom  INT=0,  
 @AgeTo   INT=0,  
 @Experience  INT=0,  
 @ExperienceMonths  INT=0,  
 @City   VARCHAR(100)='',  
 @QualificationID INT=0,  
 @PositionID  INT=0,  
 @ApplyDateFrom  DATETIME='2010-06-29 00:00:00.000',  
 @ApplyDateTo  DATETIME=NULL,
 @SortColumn Varchar(128)='ApplicantID',  
@SortDirection Varchar(56)='desc',  
@Page int=1,  
@RecsPerPage int   =10
)  
AS
DECLARE @SQL VARCHAR(MAX)                              
DECLARE @DSQL VARCHAR(MAX)  
DECLARE @whereCondition VARCHAR(1024)                              
DECLARE @FirstRec int, @LastRec int                              
SET @FirstRec = (@Page - 1) * @RecsPerPage                              
SET @LastRec = (@Page * @RecsPerPage + 1)  
Declare @SectionCount int;  
Set NoCount On  
Begin  
 SET @SQL='Select  ROW_NUMBER() over( order by '+@SortColumn + ' ' +@SortDirection +') rownum, tblApplicants.ApplicantID, tblApplicants.ApplicantName, tblApplicants.FatherName, tblApplicants.DateOfBirth,  tblApplicants.QualificationID,  tblApplicants.EMailID, tblApplicants.Address, tblApplicants.City, tblApplicants.State, tblApplicants.Phone,
 tblApplicants.ApplyDate, tblApplicants.PositionID, tblApplicants.isActive,  tblPositionMaster.PositionName 
FROM tblApplicants INNER JOIN tblPositionMaster ON tblApplicants.PositionID = tblPositionMaster.PositionID 
WHERE 1=1 AND tblApplicants.isActive=1  '
if @ApplicantName!=''
begin
  SET @sql +=' AND tblApplicants.ApplicantName like ''%'+ @ApplicantName +'%'''
end
if @AgeFrom!=0
begin
SET @SQL+=' AND DATEDIFF(YEAR,tblApplicants.DateOfBirth, GETDATE()) >= '+@AgeFrom
end
 if @AgeTo!=0
 begin
SET @SQL+=' AND DATEDIFF(YEAR,tblApplicants.DateOfBirth, GETDATE()) <= '+@AgeTo
 end
if @ApplyDateFrom IS NOT NULL
begin
SET @SQL+= ' AND CONVERT(DATETIME,tblApplicants.ApplyDate,101) ='+ CONVERT(DATETIME,@ApplyDateFrom,101)
end
SET @DSQL ='SELECT  * from (' + @SQL +') AS tbl'                              
  print @DSQL  
DECLARE @TEMPResult TABLE(RowNum INT,       
   ApplicantID int,                
ApplicantName varchar(100),  
FatherName varchar(200),  
DateOfBirth DATETIME,  
QualificationID int,  
EMailID varchar(200),  
Address varchar(200),  
City varchar(200),  
State varchar(200),  
Phone varchar(200),  
ApplyDate DATETIME,
PositionID int,
isActive int,
PositionName varchar(200)
)
     INSERT INTO @TEMPResult EXEC(@DSQL)  
SELECT (Select Count(*) from @TEMPResult) as Count, * FROM @TEMPResult WHERE RowNum > @FirstRec AND RowNum < @LastRec   
RETURN            
END

我想在 ApplyDate 上应用“ => ”和“ <= ”运算符。每次我得到“ *从字符串转换日期和/或时间时转换失败。 *

请帮助我如何在 ApplDate 上应用这些运算符

4

4 回答 4

2
SET @SQL+= ' AND CONVERT(DATETIME,tblApplicants.ApplyDate,101) ='+ CONVERT(DATETIME, @ApplyDateFrom, 101)

将其更改为:

SET @SQL+= ' AND CONVERT(DATETIME, tblApplicants.ApplyDate, 101) = CONVERT(DATETIME, ''' + cast(@ApplyDateFrom as nvarchar) + ''', 101)'
于 2013-10-01T10:38:05.483 回答
1

替换此行

AND CONVERT(DATETIME,tblApplicants.ApplyDate,101) ='+ CONVERT(DATETIME,@ApplyDateFrom,101)

更新

AND DATEDIFF(DD,tblApplicants.ApplyDate, CAST(''' + CAST(@ApplyDateFrom as varchar) + ''' as datetime)) = 0 

更多看这个查询

DECLARE @ApplyDateFrom  DATETIME='2010-06-29 00:00:00.000'
DECLARE @QUERY varchar(max)
SET @QUERY =
'SELECT  DATEDIFF(DD,GETDATE(), CAST(''' + CAST(@ApplyDateFrom as varchar) + ''' as datetime))'
PRINT @QUERY
于 2013-10-01T10:40:54.850 回答
0

您只需要确保参数在进入存储过程之前采用这种格式 yyyy-MM-dd HH:mm:ss

然后您可以使用 "<=" 和 ">=" 进行比较,并且不需要将其转换为其他格式,只需像这样比较

tblApplicants.ApplyDate >='2013-10-01 18:00:00'

在连接到动态 sql 之前,您需要将 applydate 转换为字符串。

平均 SET @SQL+= ' AND CONVERT(DATETIME,tblApplicants.ApplyDate,101) ='+ cast (CONVERT(DATETIME,@ApplyDateFrom,101) AS VARCHAR)

于 2013-10-01T10:25:39.863 回答
0

@AgeFrom是一个int。在将其连接到字符串之前,您需要将其转换为 varchar。

  'AND DATEDIFF(YEAR,tblApplicants.DateOfBirth, GETDATE()) >= '+convert(varchar(5),@AgeFrom)

当然,这并不是说这会起作用,因为datediff(year...不会给你一个年龄。例如:

 select DATEDIFF(YEAR,'2000-12-25','2013-10-01')

将返回 13,而不是 12。

同样ApplyDate将其转换为字符串

  CONVERT(DATE,tblApplicants.ApplyDate,101) = ''' + CONVERT(varchar(20),@ApplyDateFrom,111) + ''''

不过老实说,这整个方法对我来说似乎是个坏主意。

于 2013-10-01T10:20:35.723 回答