如何比较存储过程中的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

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

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

可以工作,因为smalldatetime的日期存储为整数,而时间存储为小数。

我会将日期转换为普通日期,这使得该解决方案独立于实现细节

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新