2016-06-02 4 views
1

Я работаю над сценарием, который я хочу извлечь все записи за предыдущую неделю. (7 дней)Укажите, где дата на прошлой неделе

У меня есть столбец даты, и данные хранятся в формате SQL Date, например: 2016-06-02 00: 00: 00.000 fore каждая строка.

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

Например, если этот запрос запущен в понедельник, он будет включать понедельник - воскресенье предыдущей недели, но не текущий понедельник, когда запрос выполняется.

Здесь я нахожусь с запросом, но он не работает.

select f254, 
     f01 
from sal_reg 
WHERE F254 between(getdate() - 6 and getdate() -1; 

F254 - это поле, содержащее дату.

+0

Приготовьте аргументы фильтрации перед тем запросом, а затем использовать их. Сделайте их, например, для типа даты, чтобы отключить время. –

+0

У вас есть часы? если да, попробуйте бросить (getdate() As Date) – SSD

+0

Боковое примечание от SQL Server MVP Аарон Бертран - [Плохие привычки к удару: использование сокращений с операциями даты/времени] (http://sqlblog.com/blogs/aaron_bertrand/archive/ 2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx) – Bridge

ответ

3

Использование dateadd для арифметике дат.

Edit: Как отметил @MatBailie, так как вы говорите, что f254 является datetime поля, безопаснее всего использовать верхнюю границу, что это один день после конца диапазона, который вы хотите, и затем использовать < а не <= с той стороны диапазона дат. Это связано с тем, что значения, хранящиеся в столбце f254, могут содержать компоненты времени. Даже если программное обеспечение, заполняющее эту базу данных, обычно хранит значения в этом поле, которые имеют временную метку в полночь, небезопасно предположить, что это всегда будет иметь место.

declare @Today date = getdate(); 
declare @LowerBound date = dateadd(day, -7, @Today); 
declare @UpperBound date = dateadd(day, -1, @Today); 

-- If f254 were a 'date' field, this would be appropriate: 
select f254, f01 from sal_reg where f254 between @LowerBound and @UpperBound; 

-- But if f254 is a datetime, then as @MatBailie points out, this is better: 
select f254, f01 from sal_reg where f254 >= @LowerBound and f254 < @Today; 
+1

@MatBailie, я назначаю 'getdate()' локальному типа 'date', который должен отбрасывать компонент времени из' getdate() '. Я не считаю, что явное приведение необходимо. –

+1

Op не указывает и не ответил на мой комментарий, но возможно *, что 'F254' содержит также временные части * (пример показывает, что это поле DATETIME) *. В этом случае было бы безопаснее использовать '> = @LowerBound AND <@ Today'. – MatBailie

+0

Кажется, что это должно работать, но запрос ничего не возвращает. Нет ошибок. – user1837575

0

Попробуйте с:

select f254, 
      f01 
    from sal_reg 
    WHERE F254 between DATEADD(day, -7, getdate()) and DATEADD(day, -1, getdate()); 
+0

В этом вопросе говорится, что если запрос выполняется в понедельник, набор результатов должен начинаться с данных предыдущего понедельника. Таким образом, вы хотите '-7' в вашей нижней границе, а не' -6'. –

+0

Спасибо @Joe исправлено –

-2
select f254, 
     f01 
from sal_reg 
WHERE F254 between CAST(FLOOR(Cast(getdate() - 7 AS FLOAT)) AS DATETIME) and CAST(FLOOR(CAST(getdate() -1 AS FLOAT)) AS DATETIME) 
+0

, которое было бы подходящим для 2000, а не для 2008 года –

+0

оно должно работать в SQL 2012 - в любом случае SQL опубликовал риски сбрасывания записей с начала того же дня, когда день носит, если временная метка имеет время в нем - я думаю, что у парня просто был его -6, хотя – Cato

+0

существует тип 'date' в версиях более 2000 версий. –

0

Try:

SELECT f254 
    ,f01 
FROM sal_reg 
WHERE CAST(F254 AS DATE) >= DATEADD(DAY, - 7, CAST(getdate() AS DATE)) 
    AND CAST(F254 AS DATE) <= DATEADD(DAY, - 1, CAST(getdate() AS DATE)); 
+0

Вопрос гласит, что если запрос выполняется в понедельник, набор результатов должен начинаться с данных предыдущего понедельника. Таким образом, вы хотите '-7' в вашей нижней границе, а не' -6'. –

+0

вам не нужно ничего делать с F254, так как вы контролируете правую часть сравнения. –

+0

@JoeFarrell Спасибо. Исправлено – BeaglesEnd

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