Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выполнение SELECT  [new]
karamax
Member

Откуда:
Сообщений: 57
Добрый день =)
Есть запрос по книге Мартина Грубера Понимание SQL:
SELECT *
FROM Orders
WHERE (amt < 1000 OR NOT (odate = 10/03/1990 AND cnum > 2003 ));
Таблица на скрине из той же книги.

В моей таблице дата имеет вид: 1990-03-10, соответственно запрос выглядет немного иначе:
SELECT *
FROM Orders
WHERE (amt < 1000 OR NOT (odate = 1990-03-10 AND cnum > 2003 ));

Вопрос: зачем нужны внешние скобки? Не могу проверить работу с ними и без низ, тк. mssql выдает ошибку "Operand type clash: date is incompatible with int". Тип данных использую: date (может необходимо поменять на другой тип?)

К сообщению приложен файл. Размер - 15Kb
21 май 12, 14:03    [12588426]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
апострофы
Guest
возьмите дату в апострофы
21 май 12, 14:05    [12588444]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Неудивительно.

select cast(1990-03-10 as datetime)
-----------------------
1905-06-01 00:00:00.000


Учитесь задавать даты правильно: https://www.sql.ru/faq/faq_topic.aspx?fid=109
21 май 12, 14:06    [12588455]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
aleks2
Guest
1. Учись присать дату по стандарту ISO: '19901003' и не будет те геморрою.

SELECT *
FROM Orders
WHERE (amt < 1000 OR NOT (odate = '19901003' AND cnum > 2003 ));


2. Скобке - для красоты.
21 май 12, 14:07    [12588468]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
karamax
Member

Откуда:
Сообщений: 57
Взял, теперь сработало, спасибо :). Но результат с внешними скобками и без них не отличается, зачем они в примере?
21 май 12, 14:07    [12588469]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
karamax
Взял, теперь сработало, спасибо :). Но результат с внешними скобками и без них не отличается, зачем они в примере?
Для красоты.
21 май 12, 14:08    [12588478]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
RubinDm
Member

Откуда:
Сообщений: 461
karamax, выражение 1990-03-10 надо обернуть в одинарные кавычки.
21 май 12, 14:10    [12588496]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
karamax
Member

Откуда:
Сообщений: 57
aleks2, Гавриленко Сергей Алексеевич, спасибо

видимо с 1993 года были внесены некие изменения ("по стандарту ISO"): книга от 1993 года.
21 май 12, 14:11    [12588524]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
karamax
aleks2, Гавриленко Сергей Алексеевич, спасибо

видимо с 1993 года были внесены некие изменения ("по стандарту ISO"): книга от 1993 года.
Или вы запрос неправильно переписали, или в книге тупо ошибка. Потому что выражение "10/03/1990", записанное без кавычек, является выраженим, в котором сервер сделает две операции деления, получит ожидаемый 0, потом отконвертит его в datetime. Фигня, в общем.

select cast(10/03/1990 as datetime)
-----------------------
1900-01-01 00:00:00.000
21 май 12, 14:15    [12588587]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить