Функции даты SQL Server - PullRequest
       6

Функции даты SQL Server

2 голосов
/ 12 февраля 2009

Когда я добавляю это к моему предложению where:

DueDate <= getDate() AND DueDate IS NOT null

Я получаю небольшую ошибку, которая говорит: Не удалось создать дочерний элемент: System.Reflection.TargetInvocationException: исключение было выдано целью вызова. ---> System.Data.EvaluateException: выражение содержит неопределенный вызов функции getDate ().

Есть идеи, что я делаю не так?


Обновление Используемый код:

private string getFilter(int mode) {
    String filter = "";
    if ((ALL_WORK_ORDERS & mode) == 0) {
        if ((mode & OUTSTANDING_WORK_ORDERS) == OUTSTANDING_WORK_ORDERS) {
            filter += "DueDate <= getDate() AND DueDate IS NOT null OR";
        }
        if ((mode & COMPLETED_WORK_ORDERS) == COMPLETED_WORK_ORDERS) {
            filter += " FinishedDate IS NOT  null";
        }
    }

    filter = filter.Trim();
    if (filter.EndsWith("OR")) {
        filter = filter.Remove(filter.Length - 2);
    }

    return filter;
}

И здесь привыкаешь:

tblWorkOrderBindingSource.Filter = getFilter(mode);

В таблице DueDate - это тип datetime.

Примечание: Я могу запустить

SELECT [ID]
      ,[WorkDesc]
      ,[DueDate]
  FROM [RentalEase].[dbo].[tblWorkOrder]
WHERE [DueDate] <= getDate() AND [DueDate] IS NOT null

в MS SQL Server Management Studio Express без проблем.


Окончательное решение

    private string getFilter(int mode) {
        String filter = "";
        if ((ALL_WORK_ORDERS & mode) == 0) {
            if ((mode & OUTSTANDING_WORK_ORDERS) == OUTSTANDING_WORK_ORDERS) {
                filter += "DueDate <= #" + DateTime.Now.ToShortDateString() + "# AND DueDate IS NOT null  AND FinishedDate IS null OR";
            }
            if ((mode & COMPLETED_WORK_ORDERS) == COMPLETED_WORK_ORDERS) {
                filter += " FinishedDate IS NOT null";
            }
        }

        filter = filter.Trim();
        if (filter.EndsWith("OR")) {
            filter = filter.Remove(filter.Length - 2);
        }

        return filter;
    }

Ответы [ 5 ]

4 голосов
/ 12 февраля 2009

Исключение довольно ясно, что здесь не так. Вы указываете метод getdate, который нельзя использовать в выражении фильтра. См. Документацию по свойству Expression класса DataColumn, чтобы узнать, что является допустимым, а что нет:

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

При этом вместо getdate вам необходимо объединить дату в фильтре (для получения текущей даты вызовите статическое свойство Now в структуре DateTime). Ссылка выше покажет вам, как правильно форматировать даты (вы не можете просто сделать это, как указано в ответе Келли, хотя этот ответ в большинстве случаев там).

2 голосов
/ 12 февраля 2009

вы пробовали

filter += "DueDate <= #" + DateTime.Now + "# AND DueDate is not Null"
1 голос
/ 12 февраля 2009

System.Reflection.TargetInvocationException

Это сообщение не пришло с сервера Sql. Мне кажется, что вы на самом деле пишете C # в этой строке и компилируете / интерпретируете его во время выполнения для типов .net (вместо определения таблиц).

Кроме того, SQLServer 2005 имеет проблемы с || и && ...

SELECT CASE WHEN 1=1 && 3=3 THEN 1 ELSE 0 END
--Incorrect syntax near '&'.

SELECT CASE WHEN 1=1 || 3=0 THEN 1 ELSE 0 END
--Incorrect syntax near '|'.
0 голосов
/ 12 февраля 2009

Если предполагается, что это sql, то "||" не является символом для "ИЛИ" , а "&&" не является символом для И .

filter += "DueDate <= GetDate() AND DueDate is not NULL OR ";
0 голосов
/ 12 февраля 2009

Это должен быть T-SQL? попробуйте это

DueDate <= getDate() 
AND  DueDate IS NOT null
...