2016-08-01 2 views
0

Я хочу изменить мой код для того, чтобы некоторые из них будут работать на вчерашних данных и некоторые из них будут работать на сегодняшний день данныеКак использовать синтаксис getdate для существующего кода?

Мой код (используя getdate() или любую другую функцию даты.):

(CAST(vw_public_task.complete_date AS TIME) BETWEEN '08:00' and '23:59' 
or 
CAST(vw_public_task.complete_date AS TIME) BETWEEN '00:00' and '08:00') 

Я хочу, чтобы CAST(vw_public_task.complete_date AS TIME) BETWEEN '08:00' and '23:59' будет работать по вчерашним данным и CAST(vw_public_task.complete_date AS TIME) BETWEEN '00:00' and '08:00' на сегодня данные.

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

Спасибо!

+0

Вы попробовали функцию DATEDIFF()? – PacoDePaco

+0

да ... но я вызываю у меня некоторые проблемы, как я могу объединить их обоих? –

+0

Итак, вы хотите игнорировать все, что происходит * во время последней минуты вчерашнего дня? Обычно это означает, что лучше избегать «BETWEEN» и использовать «<' и * эксклюзивные * конечные точки для периодов - их легче рассуждать и не зависят от текущей точности типа данных. –

ответ

0

Вместо того, чтобы отбрасывать свою колонку во времени (таким образом, теряя возможность проверить свою дату или использовать любые индексы, которые могут иметься в этом столбце), вы можете получить вчерашние 08:00 и сегодняшние 08:00, используя double cast и dateadd на getdate:

Это поможет вам сегодняшние 08:00:

DATEADD(HOUR, 8, CAST(CAST(GETDATE() As date) As datetime)) 

, и это поможет вам вчерашние 08:00:

DATEADD(HOUR, -16, CAST(CAST(GETDATE() As date) As datetime)) 

Так ваш где положение может быть что-то вроде этого:

WHERE vw_public_task.complete_date <= 
     DATEADD(HOUR, 8, CAST(CAST(GETDATE() As date) As datetime)) 
AND vw_public_task.complete_date >= 
     DATEADD(HOUR, -16, CAST(CAST(GETDATE() As date) As datetime)) 
+0

Привет и спасибо за ваш ответ, после того, как я его выполнил, я все еще получаю результаты с сегодняшнего дня после 08:00 (я хочу получить данные до текущей даты выполнения 08:00 и не после него.) –

+0

включают в себя [mcve] с DDL + DML для данных образца и полного запроса. Очень сложно отлаживать код, который мы не видим. –

0

Создание двух переменных.

DECLARE @Yesterday DATETIME = 
         DATEADD(HOUR, 8, 
         DATEADD(DAY, DAY(GETDATE()) - 2 , 
         DATEADD(MONTH, MONTH(GETDATE()) - 1, 
         DATEADD(YEAR, YEAR(GETDATE()) - 1900, 0)))) -- 2016-07-31 08:00:00.000 

DECLARE @Today DATETIME = DATEADD(DAY, 1, @YesterDay) -- 2016-08-01 08:00:00.000 

Где положение выглядит следующим образом:

WHERE 
    vw_public_task.complete_date <= @Today AND 
    vw_public_task.complete_date >= @Yesterday 
+0

Привет, как синтаксис должен выглядеть в конце? Я добавил данные «DECLARE», которые вы отправили в конце моего запроса, и я вставил второй код, который вы мне отправили, но он не удался для моего, возможно, я делаю что-то неправильно. –

+0

@Coldfire 'DECLARE' должен быть наверху запроса. Попробуйте это, пожалуйста. – NEER

0

Что-то, как это должно работать:

WHERE 
    vw_public_task.complete_date >= DATEADD(day,DATEDIFF(day,'19000102',GETDATE()), 
        '1900-01-01T08:00:00') and 
    vw_public_task.complete_date < DATEADD(day,DATEDIFF(day,'19000101',GETDATE()), 
        '1900-01-01T08:00:00') 

Мои DATEADD/DATEDIFF пары могут выглядеть немного напуганный, но вы можете с надеждой выяснить, что они делают. После того, как вы поймете, что DATEDIFF работает только с точки зрения переходов и возвращает int, вы увидите, что внутренние DATEDIFF выражения вычисляя, сколько (целые) дней прошло с 1/2-го января 1900 года

Затем мы добавляем это количество дней в 08:00 1 января 1900 года. Что для второго выражения означает, что мы вычисляем 08:00 сегодня. Для первого выражения, так как мы сначала подсчитали целое число дней с , но затем добавим, что на 08:00 в 1-м, это означает, что мы вчера выкладываем 08:00.

+0

«DateAdd/DateDiff» лучше, чем 'cast (@datetime cast (as date) как datetime')? –

+0

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

+0

Да, но я могу сделать с использованием 'dateadd', как в моем ответе. Я надеялся, что вы можете сказать, что любой из них лучше по производительности. ИМХО, двойное кастинг является более читаемым, но если есть удар производительности по сравнению с методом dateadd/lateiff, то, очевидно, ваш ответ лучше. –

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