Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2010, 01:58   #1
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию Две даты

Вопрос в следующем: есть два поля с датой (datetime), одно поле - дата заказа товара, второе - дата покупки товара. Естественно, дата покупки может быть либо позже , либо в тот же день, что и заказ. ТО есть order_date <= sale_date. При этом поле sale_date может принимать значение NULL (order_date НЕ принимает NULL по умолчанию), т.е. товар заказан, но еще не куплен. Но ведь, если указана дата заказа, и при этом поле с датой покупки содержит NULL, то получается следующая ситуация (пример) : '17/06/2010' <= NULL, а такого быть не может...
Вопрос может, конечно, и легкий, но я никак не соображу, как выйти из такой ситуации (ставить вместо NULL какую-нибудь "левую" дату тоже не вариант).
SQL Server 2005

Последний раз редактировалось tools; 17.06.2010 в 02:48.
tools вне форума Ответить с цитированием
Старый 17.06.2010, 02:50   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Вы забыли упомянуть, в каком случае Вам нужно проверять условие!

Цитата:
ставить вместо NULL какую-нибудь "левую" дату тоже не вариант
Именно вариант!
В SQL есть такой чудесный оператор coalesce
вот его и использовать, например, так:
Код:
 where order_date <= coalesce(sale_date,order_date)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2010, 02:57   #3
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Проверять условие в случае вставки новых данных... Спасибо за ответ, почитаем про coalesce, но тему лучше не закрывать, т.к. наверняка возникнут вопросы.

Хмм, это я так понял немного не то, функция возвращает первое ненулевое значение из числа аргументов. т.е. это для запросов, выборки данных. А мне необходимо поставить своего рода ограничения на эти поля, т.е. при вставке нового значения, поле с датой заказа мы заполняем обязательно (т.е. оно не содержит NULL), а поле с датой покупки либо NULL, либо имеет значение большее или равное дате заказа.
Примеры:
1) order_date = '17/06/2010' sale_date = '23/06/2010'
2) order_date = '17/06/2010' sale_date содержит NULL
3) order_date = '18/06/2010' sale_date = '18/06/2010'

Последний раз редактировалось Stilet; 17.06.2010 в 16:12.
tools вне форума Ответить с цитированием
Старый 17.06.2010, 03:39   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Где и как Вы собираетесь делать проверку? (триггеры, ХП, на клиенте?)

Какая у Вас СУБД?

поверьте - если там, где Вы собираетесь делать проверку, доступно использование coalesce, то это то, что Вам надо.
смотрите:

1) order_date = '17/06/2010' sale_date = '23/06/2010'
coalesce(sale_date,order_date) вернёт '23/06/2010'
следовательно, '17/06/2010' <= '23/06/2010'

order_date<=coalesce(sale_date,orde r_date)
условие выполняется!

2) order_date = '17/06/2010' sale_date содержит NULL
coalesce(sale_date,order_date) вернёт '17/06/2010'
следовательно, '17/06/2010' <= '17/06/2010'

order_date<=coalesce(sale_date,orde r_date)
условие выполняется!

(разумеется, в базу нужно сохранять NULL, а не результат функции coalesce(...)

3) order_date = '18/06/2010' sale_date = '18/06/2010'
coalesce(sale_date,order_date) вернёт '18/06/2010'

order_date<=coalesce(sale_date,orde r_date)
условие выполняется!

что Вам не нравится?

Последний раз редактировалось Serge_Bliznykov; 17.06.2010 в 03:41.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2010, 03:47   #5
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Приложение на Delphi соединяется с БД (используется sql server 2005). Я понял вашу мысль про coalesce, просто не совсем разобрался сначала с этой функцией. Скорее всего тут правильнее триггер написать "instead of insert", либо напрямую проверять вводимые даты в приложении.
Спасибо за ответы.
P.S. В итоге, я решил просто в ограничения alter table'ом добавить

Последний раз редактировалось tools; 17.06.2010 в 09:27.
tools вне форума Ответить с цитированием
Старый 17.06.2010, 16:06   #6
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

А в чём собственно загвоздка (не очень понятно)?
slips вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
даты в си Александе еть я Помощь студентам 0 06.05.2010 22:13
Автоматизация заполнения даты и зависимость ячейки времени к ячейке даты. Каравай Microsoft Office Excel 14 11.03.2010 18:11
Проверка даты Михаил Юрьевич Общие вопросы Delphi 11 24.01.2010 20:39
Даты Sparky БД в Delphi 6 02.10.2009 09:48
Даты не даты Nasya Microsoft Office Excel 3 22.08.2007 20:18