Вы должны использовать открытый диапазон дат вместо преобразования обеих сторон уравнения в региональную строку.
ALTER PROCEDURE [dbo].[myProc]
@id INT,
@date DATETIME
AS
BEGIN
SET NOCOUNT ON;
SELECT id, DATEPART(DAY, @date)
FROM dbo.myTable
WHERE id = @id
AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, @date))
AND [date] < DATEADD(DAY, 1, DATEDIFF(DAY, 0, @date));
END
GO
Теперь вы не можете просто передать getdate()
в вызов хранимой процедуры (синтаксис неверен), и вы, конечно, не можете передать его как строку. Итак, пара вариантов.
(a) Объявите переменную заранее, назначьте текущую дату / время переменной и передайте переменную в:
DECLARE @d DATETIME;
SET @d = GETDATE();
EXEC [dbo].[myProc] @id = 1, @date = @d;
(b) Сделайте параметр необязательным, а затем не беспокойтесь о передаче этого параметра в:
ALTER PROCEDURE [dbo].[myProc]
@id INT,
@date DATETIME = NULL
AS
BEGIN
SET NOCOUNT ON;
SET @date = DATEADD(DAY, 0, DATEDIFF(DAY, 0,
COALESCE(@date, GETDATE())));
SELECT id, DATEPART(DAY, @date)
FROM dbo.myTable
WHERE id = @id
AND [date] >= @date
AND [date] < DATEADD(DAY, 1, @date);
END
GO
Теперь ваш звонок может быть просто:
EXEC dbo.myProc @id = 1;
Кроме того, вы не должны использовать 'single quotes'
для псевдонимов столбцов - этот синтаксис устарел. Вместо этого используйте [square brackets]
.