2011-02-10 5 views
10

Estoy trabajando en una consulta que será un trabajo automatizado. Necesita encontrar todas las transacciones entre las 8 PM y las 8 PM para el último día. Estaba pensando en hacer algo como estoEstablecer la parte de tiempo de una variable de fecha y hora

DECLARE @start_date DATETIME 
DECLARE @end_date DATETIME 

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

Para una consulta automatizada, esto funciona bien para averiguar la parte de la fecha. Pero la parte TIME de la variable es la hora actual en que se ejecuta la consulta. ¿Existe una forma rápida y sencilla de codificar de forma rígida la porción de tiempo de ambas variables para que sea a las 8:00 PM?

+1

+1 He visto un nuevo enfoque a este problema con la respuesta de cyberkiwi de que no me habría ido sin su pregunta. ¡Gracias! =) –

Respuesta

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

Dulce. Muchas gracias. –

+1

+1 ¡Solución muy inteligente! =) –

+0

Ten cuidado con esto. Es posible que no proporcione el resultado correcto si hace dos días cae en un mes diferente, especialmente cuando el mes anterior tiene 31 o 28 días. –

6

Esto también funciona:

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 

Aunque la respuesta de cyberkiwi es muy inteligente! =)

+0

De acuerdo, muy inteligente. –

+0

Upvoted, ya que este método hace que sea muy fácil establecer todas las secciones de la porción de tiempo a la vez. Mi requisito era establecer el tiempo a 23:59:59 (el final del día pasó a un proceso almacenado) SET @start_date = LEFT (CONVERT (VARCHAR, @ start_date, 121), 10) + '23:59:59' – Morvael

-2

Tuve que hacer algo similar, crear un procedimiento para ejecutar desde un momento determinado el día anterior hasta un momento determinado en el día actual.

Esto es lo que hice para establecer la fecha de inicio a las 16:30 del día anterior, básicamente restar las partes que no desea volver a 0 y luego agregar el valor que desea que sea.

-- 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) 

Espero que esto ayude a alguien.

+2

¡Bienvenido a Stack Overflow! Por favor, no publique respuestas idénticas a múltiples preguntas. Publique una buena respuesta, luego marque/vote para cerrar las otras preguntas como duplicados. Si la pregunta no es un duplicado, * adapte sus respuestas a la pregunta. * Se encontró una respuesta duplicada [aquí] (// stackoverflow.com/a/41609720/2747593). –

1

Necesitaba sacar una fecha de la base de datos y agregarle 3:00 Pm. Lo hice de esta manera

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

El resultado fue que volviera 2017-10-01 15:00:00.000. La fecha en la base de datos es 2017-10-01. La solución que propuse fue mantener mi fecha actual. Agregué 0 días a mi fecha actual. Le di las 15:00 horas y funcionó a las mil maravillas.

Cuestiones relacionadas