2015-10-09 3 views
2
SELECT * 
FROM services 
WHERE service_date BETWEEN (dateadd(DD, -1, getdate())) AND (dateadd(DD, 1, getdate())) **---Gives us a last one day data.** 

но то, что нам действительно нужно, данные 07:00 AM вчера 06:59 AM текущий день, так что я попытался следующие:SQL запрос, чтобы выбрать диапазон от определенной даты/времени вчера на конкретные даты/времени текущего дня

SELECT * 
FROM services 
WHERE service_date BETWEEN (dateadd(DD, -1,((DatePart(hh, getdate())) >= 7))) **-- Expecting to pull from yesterday 07:00** 
        AND (dateadd(DD, -1,((DatePart(hh, getdate())) <= 6))) **-- to current day till 06:59** 

, но системе не нравились мои навыки SQL ... ПОЖАЛУЙСТА, ПОМОГИТЕ ...!

+1

Что RDBMS вы используете? MS SqlServer? –

+0

Избавьтесь от функций 'DatePart' и измените' DATEADD (DD ... 'на' DATEADD (hh ... 'вместо вычитания количества часов. – Morpheus

+0

Решения, которые я получил, велики, но я забыл упомянуть, что я запрос из связанного Sybase Server, как мне изменить одно из заданных решений для работы с Sybase? Похоже, что sybase не имеет датиффа. – Altimo

ответ

0

Предполагая, что вы на SQL Server:

Select * 
From MyTable 
Where MyDateColumn Between DATEADD(hh, 7, Cast(Cast(DATEADD(d, -1, CURRENT_TIMESTAMP) As Date) As DateTime)) 
         And DATEADD(hh, 6, Cast(Cast(CURRENT_TIMESTAMP As Date) As DateTime)) 
+0

Я забыл упомянуть, что я запрашиваю у связанного сервера Sybase. – Altimo

+0

@Altimo Тогда мне не поможет. Но вы говорите, что у Sybase нет 'DATEDIFF'. У него есть DATEADD?А разница между 'Date' и' DateTime'? В противном случае решение Генри Ляна, вероятно, будет работать, оно выглядит довольно системно-агностическим. –

0

UPDATE: Я согласен с решением Энди. Подобный подход, но его решение гораздо более элегантно и эффективно.

попробовать что-то вроде этого:

SELECT * 
FROM services 
WHERE service_date 
     BETWEEN Convert(DateTime, Convert(nchar(4), DatePart(YYYY, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(MM, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(DD, Getdate())-1) + ' 7:00:00') 
     AND Convert(DateTime, Convert(nchar(4), DatePart(YYYY, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(MM, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(DD, Getdate())) + ' 6:59:00') 

Идея заключается в том, чтобы занять год, месяц и день с сегодняшнего дня (или вчера), и сформировать новую дату по их конкатенацию.

Остерегайтесь настроек культуры для формата даты и выполняйте некоторые испытания, прежде чем вводить этот код в производство.

1

Это поможет вам даты, которые вы ищете ...

Select DATEADD(HOUR,-17, (DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0))) 


Select DATEADD(HOUR,7, (DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0))) 

Я не уверен, если это самый эффективный способ, но он работает.

+0

--- Решения, которые я получил, отличные, но я забыл упомянуть, что я запрашиваю у связанного Sybase Server, как мне изменить одно из заданных решений для работы с Sybase? Похоже, у sybase нет датиффа. – Altimo

0

Вы также можете использовать mi (минуты) с DateAdd. Добавление 419 минут до полуночи, чтобы получить 06:59 и хороший раунд 420 минут до полуночи вчера для 07:00

Edit: Изменена функция DateDiff для работы с Sybase.

SELECT * 
FROM services 
WHERE service_date BETWEEN DATEADD(mi, 420, DATEADD(d, -1, DATEDIFF(d, DATE('1900-01-01'), GETDATE()))) 
         AND DATEADD(mi, 419, DATEADD(d, -0, DATEDIFF(d, DATE('1900-01-01'), GETDATE()))); 

Edit: Удаление DateDiff функция

SELECT * 
FROM services 
WHERE service_date BETWEEN DATEADD(mi, 420, DATEADD(d, - 1, Convert(VARCHAR(10), GETDATE(), 111))) 
         AND DATEADD(mi, 419, DATEADD(d, - 0, Convert(VARCHAR(10), GETDATE(), 111))); 
+0

Это решение хорошо работает в SQL Server, но я забыл упомянуть, что я запрашиваю у связанного сервера Sybase, как мне это изменить для работы с Sybase? Похоже, у sybase нет датиффа. – Altimo

+0

Я не уверен, что функция Sybase 'CONVERT' работает так же, как SQL Server, но если так, то редактирование удаляет' DateDiff'. – Morpheus

+0

Я обновил первый пример, чтобы использовать дату, которую SQL Server интерпретирует как ноль. – Morpheus

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

  • Нет связанных вопросов^_^