SQL Server 2005 сравнивает даты - PullRequest
1 голос
/ 31 августа 2009

У меня проблема с некоторым T-SQL в SP на SQLServer 2005, сравнивая даты. Я запускаю хранимую процедуру из c # с ADO.Net и передаю нативный тип данных c # datetime (это может быть моей проблемой, поскольку я знаю, что диапазоны немного отличаются). Я делаю следующее, чтобы сравнить 2 значения DateTime в моем SP.

CREATE PROCEDURE [dbo].[spGetLikelyMatchedIndividuals_v1]
    @ID BIGINT = NULL,
    @DOB DATETIME = NULL, ...

WHERE ISNULL(CONVERT(CHAR(8),Ind.[DateOfBirth],112),'') = ISNULL(CONVERT(CHAR(8),@DOB,112),'')

В большинстве случаев это работает нормально, но по какой-то причине произойдет сбой с некоторыми датами и временем. Это одно значение даты и времени, которое не срабатывает:

1925-07-04

Есть ли у кого-нибудь идея, почему это может не сработать? Также, каков наилучший способ сравнить два значения даты без компонента времени?

Ответы [ 5 ]

2 голосов
/ 01 сентября 2009

Похоже, ваша дата сравнения правильна. Это может быть другая логика, которая вызывает эту проблему. Возможно, вам следует вставить больше хранимых процедур, чтобы найти вероятную проблему.

2 голосов
/ 31 августа 2009

Еще лучше, не делайте никакой логики с таблицей, так как это предотвратит использование вашего индекса.

Пусть ваше внешнее приложение обрабатывает гарантию того, что переменная @DOB имеет правильный формат.

1 голос
/ 31 августа 2009

Если вы сравниваете даты на SQL-сервере, изучите функцию DateDiff .

Вы можете легко сравнить две даты и указать гранулярность, например. до ближайшего дня, часа, минуты или еще чего-нибудь.

В вашем примере одним из ваших значений является дата-время, поэтому преобразуйте другое в этот тип, используя функцию Convert .

0 голосов
/ 10 февраля 2012

Операция со строкой стоит дорого в разы. Вот пример выбора дат, игнорирующих часть времени без приведения:

Select dateadd(dd,0, datediff(dd,0, yourdatetimeval)) as date_column
0 голосов
/ 31 августа 2009

Вы просто хотите сравнить компонент даты? Вы могли бы сравнить

FLOOR(CAST(x.[SomeDate] as float)) = FLOOR(CAST(@SomeDate as float))

Гораздо меньше строковой работы, и она должна выполнять эту работу. Даже лучше; создать 1-дневный диапазон и использовать это ...

DECLARE @from datetime, @to datetime

SET @from = CAST(FLOOR(CAST(@SomeDate as float)) as datetime)
SET @to = DATEADD(day, 1, @from)

...
WHERE x.[SomeDate] >= @from AND x.[SomeDate] < @to
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...