У меня есть упрощенный случай: таблица с 5 полями: startdate, starttime, enddate, endtime и totalduration, все как varchar (20). Поля даты имеют формат «02/02/2009» и формат времени «02: 02: 00». Нет нулевых значений вообще. Нет проблем для следующего запроса:
select
cast(startdate + ' ' + starttime as datetime) StartDt,
cast(enddate + ' ' + endtime as datetime) EndDt,
convert(datetime, cast(enddate + ' ' + endtime as datetime) -
cast(startdate + ' ' + starttime as datetime), 108) as DurationCalc,
Totalduration
from myTable
Это прекрасно работает, и я получаю тысячи строк данных:
StarDt EndDt DurationCalc Totalduration
2009-01-01 12:00:00 ... 03:34:12 03:34:13
....
Однако, когда я попытался применить предложение WHERE для фильтрации строк по различиям, я получил ошибку вне диапазона: «Преобразование типа данных char в тип данных datetime привело к выходу за пределы диапазона значение даты и времени ":
where
cast(startdate + ' ' + starttime as datetime) <
cast(enddate + ' ' + endtime as datetime)
-- this additional condition caused problem
and
datediff(s,
convert(datetime, cast(enddate + ' ' + endtime as datetime) -
cast(startdate + ' ' + starttime as datetime), 108),
convert(datetime, Totalduration, 108)) > 1
Поскольку в моей таблице так много строк, действительно трудно определить строку за строкой для проблемы. Я не уверен, что мне здесь не хватает, что недопустимые строки не отфильтровываются, или есть ли какой-нибудь способ узнать строки, которые существуют вне допустимого диапазона? Есть предложения?
Если я уберу datediff «дополнительное условие» (...), я могу получить строки в результате. Кажется, нет никаких проблем в первых рядах. Я применил Top 1, чтобы выбрать, я все еще получаю ошибку вне диапазона.