2014-01-31 2 views
1

Я пытаюсь сделать страницу объявления с asp.net C# и sql-сервером.выбор строк между двумя датами

На этой странице у меня есть «всплывающее» поле в дате и если это поле отмечено, я хочу показать этот код объявления в tinybox следующим образом.

http://i.imgur.com/kcn5QoB.png

Его работает, но у меня есть проблемы с датами.

Я хочу перечислить последнее поле "popup" checked и если это поле между двумя датами. My SQL-запрос выглядит следующим образом:

Select Top 1 * 
    From duyurlarx 
    Where ([popup] = 1) 
     And tarih 
      BETWEEN convert(date, getdate()) 
       AND DATEADD(day,popupsure,convert(date, getdate())) 

поле Объяснение:

tarih = date field 
popupsure = day count for popup show 

Это означает, что, если поле "Тарих" = 01.02.2014 и поле "popupsure" = 3, то это объявление будет показано до тех пор, 04.02.2014.

Однако, когда я меняю поле даты на 1 или 2 дня раньше, он не работает. Я делаю что-то неправильно?

ответ

3

Ваш запрос говорит «Дайте мне все [duyurlarx] с [Тарих] между сегодня и [popupsure] дней спустя» |TODAY ---- TARIH ---- TODAY + POPUPSURE|

Это звучит, как вы хотите, наоборот: все [duyurlarx ], где сегодня находится между [Тарих] и [Тарих + popupsure]

|TARIH ---- TODAY ---- TARIH + POPUPSURE|

это будет соответствовать

Select Top 1 * 
From duyurlarx 
Where ([popup] = 1) 
    And convert(date, getdate()) 
     BETWEEN tarih 
      AND DATEADD(day, popupsure, tarih) 

Звучит ли это правильно?

+0

Кроме того, рассмотрите возможность добавления вычисленного столбца на duyurlarx для 'DATEADD (DAY, popupsure, tarih)' –

+0

вы правы. Я пропущу этот момент. Благодарю. –

0

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

Select Top 1 * 
    From duyurlarx 
    Where ([popup] = 1) 
     And cast(tarih as Date) 
      BETWEEN Cast(GetDate() as Date) 
       AND Cast(DATEADD(day,popupsure,convert(date, getdate())) as Date) 
+0

GetDate() возвращает DateTime, я думаю, –

+0

Не он уже делает, что, по существу, ? С 'convert (date, getdate())'? – jadarnel27

+0

@RickS, что опасно неправильно после полуночи 'GETDATE()! = '2014-01-31''. Марьям прав. Это была колоссальная боль, прежде чем SQL 2008 представила тип «DATE» –

0

Это еще один вариант, который будет работать

Select Top 1 * 
From duyurlarx 
Where ([popup] = 1) 
    And cast(getdate() as date) 
     BETWEEN cast(tarih as date) AND cast(tarih + popupsure as date) 

Вы хотите CAST AS DATE, потому что вы не хотите минут. И вы хотите, чтобы проверить, если сегодня между Тарих и Тарих + popupsure

Единый день добавляется по умолчанию, когда вы говорите dateField + 1

+0

Тот факт, что вы должны объяснить, что «Один день добавляется по умолчанию, когда вы говорите, что DateField + 1» демонстрирует, что он менее ясен, чем DATEADD (DAY, [num], [date]) –

+0

Это менее понятно только для те, кто не знает, как работает сервер db, и, по сути, это хороший предмет для обучения. Я также могу указать, что 'CAST to DATE' быстрее, чем' convert' –

+0

Первый ответ работает.Спасибо тебе того же. –

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