Я довольно легко воспроизвел этот конец. Я нашел с помощью DATEADD
решено
DATEADD(MINUTE, 23*60 + 30, CONVERT(DATETIME,CONVERT(DATE, VRSAS.EventOn)))
Но я на самом деле не уверен почему. Шаги для воспроизведения ниже.
CREATE TABLE ViewRangeSheetActualStatus
(EventOn DATETIME,
[Status] BIT,
RangeSheet INT
)
INSERT INTO [dbo].[ViewRangeSheetActualStatus]([EventOn], [Status], [RangeSheet])
SELECT '20100903 11:02:39.517', 1, 1 UNION ALL
SELECT '20100731 11:03:23.577', 1, 1 UNION ALL
SELECT '20100731 00:00:00.000', 1, 1
/*Selects ALL records - No error*/
SELECT
CONVERT(DateTime, (CONVERT(varchar(50),CONVERT(Date, VRSAS.EventOn))
+ ' ' +
CONVERT(varchar(50), CONVERT(Time, '23:30')))) E
FROM ViewRangeSheetActualStatus VRSAS
/*Selects top (1) record - Error!*/
SELECT top (1)
CONVERT(DateTime, (CONVERT(varchar(50),CONVERT(Date, VRSAS.EventOn))
+ ' ' +
CONVERT(varchar(50), CONVERT(Time, '23:30')))) E
FROM ViewRangeSheetActualStatus VRSAS
Глядя на свойства ComputeScalar
в плане выполнения, они различаются.
Все
(CONVERT(datetime,(CONVERT(varchar(50),CONVERT(date,[ViewRangeSheetActualStatus].
[EventOn] as [VRSAS].[EventOn],0),0)+[@1])+CONVERT(varchar(50),CONVERT(time(7),
[@2],0),0),0))
Топ 1
(CONVERT(datetime,(CONVERT(varchar(50),CONVERT(date,[ViewRangeSheetActualStatus].
[EventOn] as [VRSAS].[EventOn],0),121)+' ')+'23:30:00.0000000',0))
Перед окончательным преобразованием в datetime
первый производит варчар, содержащий следующее
------------------------------
Sep 3 2010 11:30PM
Jul 31 2010 11:30PM
Jul 31 2010 11:30PM
Вторая версия производит варчар, содержащий
------------------------------
2010-09-03 23:30:00.0000000
Именно .0000000
вызывает проблему при возвращении к datetime
. Я понятия не имею, почему добавление TOP
к запросу вызовет это совершенно несвязанное изменение в поведении.