Я заранее прошу прощения, если этот вопрос слишком длинный, но я хотел убедиться, что я включил все шаги, которым я следовал, чтобы добраться до этой точки.
В моей базе данных SQL Server 2008 есть следующая таблица:
CREATE TABLE [VSPRRecalc](
[VSPRDate] [datetimeoffset](7) NOT NULL,
[CalcType] [int] NOT NULL,
CONSTRAINT [PK_VSPRRecalc] PRIMARY KEY CLUSTERED ([VSPRDate] ASC)
В нем есть несколько строк, которые выглядят так:
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-15 10:17:49.5780000 -05:00','3')
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-16 07:44:03.3750000 -05:00','1')
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-17 07:40:40.1090000 -05:00','1')
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-18 16:29:02.2203744 -05:00','2')
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-20 09:58:50.1250000 -05:00','1')
INSERT [vsprrecalc](VSPRDate,CalcType) VALUES('2010-12-29 19:21:26.8120000 -05:00','1')
Я использую linq, чтобы проверить и посмотреть, существует ли заданная дата в этой таблице:
var recalc = (from re in VSPRRecalcs
where re.VSPRDate.Date == oDate.Value.Date
select re).SingleOrDefault();
В настоящее время recalc
возвращает ноль, когда дата находится в пределах 5 часов от полуночи (как в случае 12-29 в операторах вставки выше). Я проверил, и следующий sql выполняется:
exec sp_executesql N'SELECT [t0].[VSPRDate], [t0].[CalcType]
FROM [dbo].[VSPRRecalc] AS [t0]
WHERE
CONVERT(DATE, [t0].[VSPRDate]) = @p0',N'@p0 datetime',@p0='2010-12-29'
, который возвращает 0 записей. Я изменил запрос, чтобы облегчить игру, и предложил следующее:
declare @t as date
set @t = '2010-12-29'
select *,
case when CONVERT(DATE, [VSPRDate]) = @t then 'true' else 'false' end
from VSPRRecalc where
CONVERT(DATE, [VSPRDate]) = @t
Этот запрос работает для любой другой даты в таблице, но не для любой даты, которая находится в пределах 5 часов после полуночи (снова см. 12-29 выше). Если я выполняю приведенный выше запрос без предложения where, в строке 12-29 действительно отображается «true», поэтому ясно, что логическое значение оценивает то, что я ожидаю в операторе select
, но не в предложении where
. Почему это происходит?