2011-02-10 3 views
10

Я работаю над запросом, который будет автоматизированным заданием. Он должен найти все транзакции между 8 вечера и 8 вечера в последний день. Я думал сделать что-то подобноеЗадать временную часть переменной datetime

DECLARE @start_date DATETIME 
DECLARE @end_date DATETIME 

SET @start_date = DATEADD(DAY, -2, GETDATE()) 
SET @end_date = DATEADD(DAY, -1, GETDATE()) 

Для автоматизированного запроса это хорошо работает при определении даты. Но часть TIME переменной - это текущее время выполнения запроса. Есть ли простой простой способ жестко кодировать временную часть обеих переменных в 8:00 PM?

+1

+1 Я видел новый подход к этой проблеме с ответом cyberkiwi, что я не пошел бы без вашего вопроса. Благодаря! =) –

ответ

28
DECLARE @start_date DATETIME 
DECLARE @end_date DATETIME 

SET @start_date = DATEADD(hour, 20, DATEDIFF(DAY, 2, GETDATE())) 
SET @end_date = @start_date + 1 

select @start_date, @end_date 
+0

Сладкий. Большое спасибо. –

+1

+1 Очень умное решение! =) –

+0

Будьте осторожны с этим. Это может не дать правильный результат, если два дня назад приходится на другой месяц, особенно если в предыдущем месяце было 31 или 28 дней. –

6

Это также будет работать:

DECLARE @start_date datetime 
DECLARE @end_date datetime 

SET @start_date = LEFT(CONVERT(nvarchar, DATEADD(DAY, -2, GETDATE()), 120), 11) + N'20:00:00' 
SET @end_date = @start_date + 1 

select @start_date, @end_date 

Хотя ответ cyberkiwi является очень умный! =)

+0

Согласен, очень умный. –

+0

Упрощенный, так как этот метод позволяет легко установить все части временной части сразу. Мое требование состояло в том, чтобы установить время до 23:59:59 (конец дня перешел в сохраненную процедуру) SET @start_date = LEFT (CONVERT (VARCHAR, @ start_date, 121), 10) + '23:59:59' – Morvael

-2

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

Это то, что я сделал, чтобы установить дату начала до 16:30 в предыдущий день, в основном вычтем части, которые вы не хотите вернуть их обратно в 0, затем добавьте значение, которое вы хотите.

-- Set Start Date to previous day and set start time to 16:30.00.000 

SET @StartDate = GetDate() 
SET @StartDate = DateAdd(dd,- 1, @StartDate) 
SET @StartDate = DateAdd(hh,- (DatePart(hh,@StartDate))+16, @StartDate) 
SET @StartDate = DateAdd(mi,- (DatePart(mi,@StartDate))+30, @StartDate) 
SET @StartDate = DateAdd(ss,- (DatePart(ss,@StartDate)), @StartDate) 
SET @StartDate = DateAdd(ms,- (DatePart(ms,@StartDate)), @StartDate) 

Надеюсь, это поможет кому-то.

+2

Добро пожаловать в переполнение стека! Пожалуйста, не отправляйте идентичные ответы на несколько вопросов. Отправьте один хороший ответ, затем отметьте/голосуйте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, * адаптируйте свои ответы на вопрос. * Дублированный ответ найден [здесь] (// stackoverflow.com/a/41609720/2747593). –

1

Мне нужно было вытащить дату из базы данных и добавить к ней 3:00 Pm. Я сделал это так

select dateadd(hour, 15, datediff(day, 0, myDatabaseDate)) 
from dbo.myDatabaseTable 
where myDatabaseId = 1 

В результате, что возвращаемый был 2017-10-01 15:00:00.000. Дата в базе данных: 2017-10-01. Решение, которое я предложил, состояло в том, чтобы сохранить текущую дату. Я добавил 0 дней к моей существующей дате. Я дал ему 15:00 часов, и это сработало как шарм.

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