TSQL DateTime проблема - PullRequest
       10

TSQL DateTime проблема

0 голосов
/ 12 августа 2009

У меня есть упрощенный случай: таблица с 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, чтобы выбрать, я все еще получаю ошибку вне диапазона.

Ответы [ 2 ]

4 голосов
/ 12 августа 2009
Сервер

Sql имеет функцию IsDate () . Используйте это, чтобы идентифицировать ваши проблемные строки. Затем исправьте таблицу, чтобы сохранить данные в виде столбцов DateTime.

0 голосов
/ 12 августа 2009

Я видел эту ошибку раньше, обычно из-за форматов дат США и Великобритании, это зависит от того, как данные были вставлены в базу данных.

Другая проблема (связанная) заключается в том, что при использовании даты и времени, когда вы используете дату в качестве параметра, вам всегда нужно добавлять 1 дополнительный день к дате окончания при выполнении диапазонов дат (или вычислений разницы дат)

Darknight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...