我正在编写存储过程来比较日期,但它无法正常工作。我该怎么做才能只比较日期而不是时间?我尝试做的是比较时间,如果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
答案 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及以上版本中