如何比较存储过程中的smalldatetime

时间:2014-03-12 21:27:16

标签: sql sql-server stored-procedures smalldatetime

我正在编写存储过程来比较日期,但它无法正常工作。我该怎么做才能只比较日期而不是时间?我尝试做的是比较时间,如果Id为空,则插入具有相同名称但新时间的新条目。我保留了多个名称相同但测试时间不同的条目。

ALTER PROCEDURE [dbo].[UL_TestData]
(
@Name varchar(30),  
@Test_Time smalldatetime,   
@ID INT output
)
AS
Declare  @UpdateTime smalldatetime
SELECT @ID=ID FROM Info_User WHERE Name=@Name AND  UpdateTime= @Test_Time
IF(@ID IS NULL)
 BEGIN
INSERT INTO Info_User (Name, UpdateTime) VALUES (@Name, @UpdateTime)    
 END

2 个答案:

答案 0 :(得分:1)

根据DBMS的类型,有很多解决方案,但这里有一个:

SELECT @ID=ID FROM Info_User WHERE Name=@Name AND floor(cast(@UpdateTime as float))= floor(cast(@Test_Time as float))

这是有效的,因为smalldatetime的日期存储了整数,其中时间存储为小数。

答案 1 :(得分:0)

我会将日期转换为明确的日期,这使得此解决方案独立于实现细节

select @ID=ID 
  from info_user
 where Name = @Name
   and cast (UpdateTime as Date) = Cast(@TestTime as Date)

但是,我要将UpdateTime的日期部分添加为附加(计算)列,或将信息拆分为日期和时间部分。这使得按明确日期查询条目变得更加容易。

根据经验法则:列的类型(通常:表格布局)在很大程度上取决于您通常针对数据运行的查询类型。

编辑:正如attila指出的那样,date数据类型仅存在于2008及以上版本中