Невозможно преобразовать строку в значение smalldatetime - PullRequest
0 голосов
/ 22 июня 2009

Это мое утверждение, которое бросает Exception высказывание

Невозможно преобразовать строку в значение smalldatetime

Как мне это исправить или написать правильное утверждение?

da = new SqlDataAdapter("SELECT name,[build-id],exitTime,enterTime,tagType FROM Employees,GateLogging WHERE GateLogging.tagType='Employee' AND enterTime=DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10", MyConn);

Ответы [ 3 ]

2 голосов
/ 22 июня 2009

В предложении WHERE удалите одинарные кавычки вокруг оператора DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10.

EDIT

Вы также сравниваете поле даты и времени с тем, что я бы назвал логическим. Удалить enterTime=. Ваше заявление должно выглядеть так:

da = new SqlDataAdapter("SELECT name,[build-id],exitTime,enterTime,tagType FROM Employees,GateLogging WHERE GateLogging.tagType='Employee' AND DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10", MyConn);

РЕДАКТИРОВАТЬ 2

Ваше определение таблицы выглядит следующим образом:

tagID bigint
enterTime nchar(10) 
exitTime nchar(10) 
date nchar(10) 

Конечно, enterTime нельзя использовать в DATEDIFF, так как это не DATETIME.

Вопрос: Почему вы храните даты и время как NCHAR (10) вместо DATETIME? Это не хороший стиль!

Решение 1: Измените enterTime и exitTime на DATETIME и все в порядке.

Решение 2. Измените свое утверждение, чтобы преобразовать enterTime в действительное DATETIME. Я предполагаю, что enterTime содержит только время суток, поэтому вам придется смешивать часть даты перед преобразованием.

РЕДАКТИРОВАТЬ 3

Предполагая, что date сохраняет день в формате yyyymmdd и enterTime хранит время в формате hh:mm:ss, вы сможете собрать DATETIME:

CONVERT(DATETIME, SUBSTRING(date, 1, 4) + '-' + SUBSTRING(date, 5, 2) + '-' + SUBSTRING(date, 7,2) + ' ' + entryTime, 102)

Итак, ваше утверждение сверху будет выглядеть так:

da = new SqlDataAdapter(
     "SELECT name,[build-id],exitTime,enterTime,tagType 
      FROM Employees,GateLogging 
      WHERE GateLogging.tagType='Employee' AND
      DATEDIFF(minute,CONVERT(DATETIME, SUBSTRING(date, 1, 4) + '-' + SUBSTRING(date, 5, 2) + '-' + SUBSTRING(date, 7,2) + ' ' + entryTime, 102),GETDATE())>10", MyConn);

В случае, если формат даты / времени, хранящийся в полях вашей базы данных, отличается, вам придется соответствующим образом скорректировать операторы SUBSTRING в пределах CONVERT().

1 голос
/ 22 июня 2009

Первое, что вы поместили в DATEDIFF в кавычки (') и сравнили его с enterTime, который, как я подозреваю, является типом smalldatetime, поэтому вы получили ошибку. Правильный SQL будет:

  SELECT name,[build-id],exitTime,enterTime,tagType 
  FROM Employees,
  GateLogging 
  WHERE 
      GateLogging.tagType='Employee'
  AND
      enterTime = DATEDIFF(minute,GateLogging.enterTime,GETDATE())

Что касается вашего> 10, я думаю, вам не следует сравнивать его с enterTime, а использовать вместо этого:

    SELECT name,[build-id],exitTime,enterTime,tagType
    FROM Employees,
    GateLogging 
    WHERE 
    GateLogging.tagType='Employee'
    AND
    DATEDIFF(minute,GateLogging.enterTime,GETDATE()) >10
0 голосов
/ 22 июня 2009

Я бы также не сказал, что вы не используете синтаксис соединения в стиле ANSI - это может вызвать проблемы в дальнейшей жизни.

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