0

我正在编写存储过程来比较日期,但它不能正常工作。我怎样才能使它只比较日期而不比较时间?我想要做的是比较时间,如果 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
4

2 回答 2

1

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

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

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

于 2014-03-12T21:34:26.483 回答
0

我会将日期转换为一个简单的日期,这使得该解决方案独立于实施细节

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

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

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

编辑:正如 attila 指出的,该date数据类型仅存在于 2008 版及更高版本中

于 2014-03-12T21:51:07.993 回答