2016-08-24 1 views
-1

Ниже сценария по понедельникам идет 3 дня назад, остальные дни идут 1 день назад. Я думаю, что это не работает должным образом. Можете ли вы помочь мне исправить это?По понедельникам получение данных пятницы

MyDate>=dateadd(dd,case substring(datename(dw,getdate()),1,3) 
when 'MON' then -3 else -1 end,getdate()) 
+2

Что означает «Я думаю, что это не работает должным образом»? Какие результаты или ошибки вы получаете? – Egl

+0

Он не фиксирует все данные, которые были получены в пятницу. Некоторые данные отсутствуют! – user6751695

ответ

-1

Я думаю, что может быть потому, что вы используете GETDATE() в качестве 3-го параметра DATEADD, который имеет часть времени, а также.

Это займет у вас 3 дня (фактически 3 * 24 часа позади), но это не будет отражать начало пятницы или что-либо, что происходит до 3 * 24 часа назад.

Скажите, что вы выполняете запрос в понедельник в 11:45, и вы получите все данные с пятницы, начиная с 11:45, но ничего раньше, что из-за «временной» части данные.

Ниже представлена ​​измененная версия вашего кода, которая будет захватывать все данные/строки, которые произошли в пятницу (весь день).

MyDate>= dateadd(dd, case 
         substring(datename(dw,getdate()),1,3) 
          when 'MON' 
           then -3 
          else -1 end 
         ,cast(cast(getdate() as date) as datetime)) 

Чтобы решить эту проблему, просто сделать быстрый хак и конвертировать getdate() на сегодняшний день и в DATETIME для создания комбинации даты/времени, который содержит начало дня.

Вот краткий пример того, что он делает:

select 
    getdate() 
    , cast(getdate() as date) 
    , cast(cast(getdate() as date) as datetime) 

2016-08-24 13:05:11.603 | 2016-08-24 | 2016-08-24 00:00:00.000 
+0

Почему downvote? Мне любопытно, что случилось с моим ответом. –

+0

Извините, я пометил его по ошибке. Я только что указал на правильный ответ. Спасибо за вашу помощь. – user6751695

+0

@ user6751695 Ну, пожалуйста, отмените нисходящее движение, если вы не хотели :) –

0
MyDate>=case 
when datename(dw,getdate())='Monday' 
then dateadd(day,-3,cast(getdate() as date)) 
else dateadd(day,-1,cast(getdate() as date)) end 
0

Вы можете использовать ниже запрос.

select case when datepart(weekday ,cast((floor(cast(getdate() as float))) as datetime)) = 2 
      then (select cast((floor(cast(getdate() as float))-3) as datetime)) 
      else (select cast((floor(cast(getdate() as float))-1) as datetime)) 
      end as Date 
Смежные вопросы