Как сравнить 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 хранится целыми числами, где время хранится в виде десятичных дробей.