2015-11-16 1 views
0

У меня есть таблица:TSQL записи на основании выбора даты и нуль

ID as int, ParentId as int, FreeFromTerxt as varchar(max), ActiveUntil as DateTime 

В качестве примера, в пределах этой таблицы у меня есть две записи.

1, 100, 'Some text', '2015-11-30 12:10:09.0000000' 
2, 100, 'New text', null 

То, что я пытаюсь сделать, это получить текущую активную запись, что в случае выше, будет записью 1. Чтобы сделать это, я просто выбрать со следующими критериями:

ActiveUntil > GETDATE() 

это работает отлично, но если я изменил первую дату до 2015-10-30, мне нужно получить нулевую запись, поскольку эта запись будет иметь приоритет.

Так что я изменил код, чтобы быть:

((ActiveUntil is NULL) OR (ActiveUntil > GETDATE())) 

Но это не работает.

+0

Вы хотите взять нулевую запись в качестве резервной записи, если в разделе «ParentID» нет «ActiveUntil»? Вы хотите только один за «ParentId» или все? –

ответ

0

Вот несколько примеров с union:

DECLARE @t TABLE (d DATETIME) 
INSERT INTO @t 
VALUES (NULL), 
     ('2015-11-30') 

SELECT TOP 1 * 
FROM (SELECT * , 1 AS ordering 
      FROM  @t 
      WHERE  d > GETDATE() 
      UNION ALL 
      SELECT * , 2 AS ordering 
      FROM  @t 
      WHERE  d IS NULL 
     ) t 
ORDER BY ordering, d 

Для 2015-11-30 возвращает 2015-11-30. Для 2015-10-30 он возвращает null.

0

Попробуйте так:

((ActiveUntil is NULL) OR (CONVERT(char(10), ActiveUntil ,126)) > GETDATE()) 

См MSDN для Cast and Convert. Спецификатор 126 формата предназначен для ГГГГ-ММ-ДД. Или вы можете использовать CAST

((ActiveUntil is NULL) OR (CAST(ActiveUntil as Date) > GETDATE()) 
+0

Вы отключили ActiveUntil, а не getdate. И лучше бросить на сегодняшний день, потому что вы бросаете в варчар, а затем на новый день –

+0

@GiorgiNakeuri: - Да. Спасибо, что указали это! –

+0

Проблема с этим, когда в таблице «2015-11-30» будет возвращено 2 строки. –

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