Как сравнить smalldatetime в хранимой процедуре

Я пишу хранимую процедуру для сравнения дат, но она не работает должным образом. Как сделать так, чтобы сравнивались только даты, а не время? То, что я пытаюсь сделать, это сравнить время и, если идентификатор равен нулю, вставить новую запись с тем же именем, но с новым временем. Я храню несколько записей с одним и тем же именем, но разным временем тестирования.

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 ответа

Решение

Я хотел бы привести даты к простой дате, что делает это решение независимым от деталей реализации

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

Тем не менее, я бы либо добавить часть даты UpdateTime в качестве дополнительного (рассчитанного) столбца или разбить информацию на дату и время. Это значительно упрощает запрос записей к простой дате.

Практическое правило. Тип столбцов (в общем случае: макет таблицы) в значительной степени зависит от типа запроса, который вы обычно запускаете для своих данных.

Редактировать: как отметил Аттила, date тип данных существует только в версии 2008 и выше

Есть много решений для этого в зависимости от того, какой тип СУБД, но вот одно:

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

это работает, потому что дата smalldatetime хранится целыми числами, где время хранится в виде десятичных дробей.

Другие вопросы по тегам