可以工作,因为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))
我会将日期转换为普通日期,这使得该解决方案独立于实现细节
select @ID=ID
from info_user
where Name = @Name
and cast (UpdateTime as Date) = Cast(@TestTime as Date)
但是,我要么将UpdateTime
的日期部分作为附加(计算)列添加,要么将信息拆分为日期和时间部分。这使得按纯日期查询条目更加容易。
根据经验:列的类型(通常是表布局)很大程度上取决于通常对数据运行的查询类型。
编辑:正如attila指出的,date
数据类型只存在于2008版本及以上