2017-01-11 4 views
0

Я пишу сложный запрос, и у меня возникают некоторые проблемы с расчетом от случая выражения (спасибо). По сути, благодаря некоторой большой помощи на этом сайте мне удалось решить другую проблему, используя упорядоченную таблицу, но теперь один из операторов выбора, которые я ранее использовал, больше не работает с OT.расчет длительности (дата - дата) от случая выражения

Я получаю сообщение об ошибке:

Conversion failed when converting date and/or time from character string

Ядра проблемы заключается в том, что я хочу, чтобы вычислить продолжительность вычитания даты начала с даты окончания. Код, который я ранее использовал

select 
    cast((CASE 
      WHEN ap.startLIKE '%[^0-9]%' 
       THEN CAST(ap.end as datetime) 
       ELSE NULL 
      END) 
      - 
      (CASE 
       WHEN ap.start LIKE '%[^0-9]%' 
       THEN CAST(ap.start as datetime) 
       ELSE NULL 
      END) as time) as Duration, 
    ap.start, ap.end, ap.description 
from 
    Table as AP 
group by 
    ap.start, ap.end, ap.description 

, но когда я изменил рисовать эту информацию из упорядоченной таблицы как:

Select 
    ot.starttime as "Start Time", 
    ot.endtime as "End Time", 
    ot.description "Description", 
    ot.entrynumber as "ID Number", 
    cast((CASE 
      WHEN ot.endtime LIKE '%[^0-9]%' 
       THEN CAST(ot.endtime as datetime) 
      ELSE NULL 
      END) 
      - 
      (CASE 
       WHEN ot.starttime LIKE '%[^0-9]%' 
       THEN CAST(ot.starttime as datetime) 
       ELSE NULL 
      END) as time) as duration 
From 
    OrderedTable as OT 
group by 
    ot.starttime, ot.endtime, ot.description, ot.entrynumber 
order by 
    ot.endtime 

Я получаю сообщение об ошибке. Раньше применение предложения group by удалило ошибку, но не из упорядоченной таблицы.

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

Исходной проблемой является то, что поля даты на сервере находятся в формате nvarchar, а не в datetime, я пытался обойти это.

+1

Дело выражение, а не дело. – jarlh

+0

Очевидно, что 'OrderedTable' имеет строки с разными форматами дат, которые не выполняют преобразование. –

+0

Исходные данные одинаковы, однако, ap.starttime = ot.starttime. – Raven

ответ

0

Поскольку столбец был отформатирован в nvarchar32, а не дата/время, которое должно было быть, это привело к тому, что периодически база данных получала текстовое значение для (некоторых) открытых записей для времени окончания, а не значение NULL. Это происходило только периодически и по любой причине, предложенной тем, кто проектировал базу данных.

Это идеальное место не должно происходить из-за его соглашения с базой данных для такого рода вещей, поскольку значения NULL просто игнорируются функциями вычисления, поскольку они неизвестны. Пока неясно, почему выражение case не решило проблему, но с помощью фильтра FinishTime <> «текст ошибки» я решил проблему.

0

Если я правильно понимаю ваш вопрос - вы можете использовать

TIMEDIFF(date1, date2) или TIMESTAMPDIFF(SECOND, date2, date1);

где date2 < date1 найти время между двумя датами. В первом случае вы получите результат в формате HH: mm: ss, а во втором случае он будет в секундах - зависит от того, что вам нужно. Поскольку вы не опубликовали пример того, как выглядит дата в вашем столбце, я не могу быть уверен, но я думаю, вам не нужны конверсии - вы можете вычесть свои даты в виде символов (если они выглядят так »2016-12-31 11 : 02: 00 ')

+0

Я попытался вычесть их непосредственно – Raven

+0

Причина выражения case заключается в том, что он пытается удалить ошибочные данные, которые не находятся в формате даты, поскольку столбец находится в формате nvchar, а не дата/время. Дело в том, что оно работает, когда оно применяется к самой таблице, но не к упорядоченной таблице, созданной в запросе, или при размещении внутри предложения OT.Я просто пытаюсь понять суть проблемы, поскольку имею дело с более чем 90 тысячами строк, и я не могу легко понять, что вызывает проблему. – Raven

+0

Я понимаю. Можете ли вы рассказать мне, почему вы проверяете время начала дважды (в каждом случае)? Потому что здесь 'СЛУЧАЙ КОГДА ot.starttime LIKE '% [^ 0-9]%' ТОГДА CAST (ot.endtime, как DateTime) ELSE NULL END' вы проверяете StartTime, а затем преобразовать время окончания –

Смежные вопросы