2017-10-11 56 views
1

我们用下面的SQL片段在where条件的SQL Server存储过程的:SQL Server查询的WHERE条件

convert(varchar, CreateDate, 101) <= convert(varchar, GETDATE() - @numberofdays, 101) 
  • CreateDate数据类型为datetime
  • @numberofdays数据类型是int

你能否确认这种情况是否可以正常工作,在比较日期之前,数据类型是否转换为varchar?

+2

你为什么在比较它们之前将它们转换为字符串?,您可以将它们作为日期时间进行比较。 –

+0

另外:'GETDATE() - @ NumberOfDays'不是很清楚 - 你肯定**减号运算符会减去天数吗?这是一个假设....我建议使用'DATEADD(DAYS,-1 * @numberofdays,GETDATE())'清晰明了。另外:你应该**总是**为'varchar'指定一个**显式长度** - 否则,当一个意外的默认长度启动时,你可能会遇到一个令人讨厌的惊喜..... –

+0

@MarcGuillot表达式GETDATE() - NumberOfDays通过减去天数来返回正确的输出。你知道使用GETDATE() - NumberOfDays是否会有任何性能影响。如果是的话,我们可以使用dateadd()函数 – bhanu

回答

3
CreateDate <= DATEADD(day,-1*@numberofdays,GETDATE()) 
+0

感谢您回复Tapakah,但在我的问题上面写的查询是错误的还是会给出不正确的输出? – bhanu

+0

Rigth比较datetime类型 –

+1

@bhanu它会给你不正确的输出,返回12/01/2016大于01/01/2017。如果您确实需要字符串,则应使用格式111,而2016/12/01比2017/01/01小。 –

0

是的,它会工作。

见下面查询从他们

declare @numberofdays int 
set @numberofdays=3 

declare @CreateDate datetime 
set @CreateDate= '2017-03-20' 

select 
convert(varchar,@CreateDate, 101) as date1, 
convert(varchar,GETDATE()- @numberofdays,101) as date2 

输出

date1 date2 
03/20/2017 10/08/2017 

这是在相同的格式,并将努力

working demo

+0

它不会引发例外情况,但它会允许2016年日期(例如12/01/2016)被考虑大于2017年的日期(如01/01/2017)。 –

+0

如果他坚持将它们转换为字符串,他应该使用格式111(yyyy/mm/dd) –