2012-04-19 16 views
8

Soy un novato en SQL Server. Por favor, ayúdame a escribir la siguiente lógica en una consulta.IF Condición en una consulta SQL

If getnow() > today 4 PM 
Then 
    SELECT * 
    FROM table 
    WHERE MailDate is Tomorrow 
Else 
    SELECT * 
    FROM table 
    WHERE MailDate is Today 

Respuesta

6
select * 
from table 
where DATEDIFF(day, GETDATE(), maildate) = case when 
    DATEPART(hour, GETDATE()) >= 16 then 1 else 0 
end 
+2

Hola RobIII, amigo. Solo quería decir que te devolví el voto, pero los votos a favor pueden ser el resultado de las conversaciones en esta publicación. No se lo tome como algo personal, todos podemos aprender algo :) Simplemente recuerde pensar en lo que está diciendo mientras lo publica y considere cómo podría llegar a otros. Yo y otros aquí luchamos arduamente para hacer de TAN una comunidad amigable que dé la bienvenida a todos los niveles de habilidad y les da a todos una oportunidad. Parece que la tuya también ha sido marcada como la respuesta, ¡felicidades y que tengas un gran día! – mellamokb

+0

Roblll, Te he subido de nivel y si te hace sentir mejor, me gustaría decir que implementé tu código ya que parecía muy eficiente. Por supuesto, me tomó un tiempo entenderlo. :) Muchas gracias – user1345260

0
IF (DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0) 

SELECT * 
FROM table 
WHERE MailDate is Tomorrow 

ELSE 

SELECT * 
FROM table 
WHERE MailDate is Today 

Esto es MS SQL. Si desea hacer más que solo un comando/seleccionar dentro de si COMIENZA ... END.

+0

Desde cuando apoyo MSSQL 'DONDE MailDate es Tomorrow' o' DONDE MailDate es Hoy'? Además, el operador ['is'] (http://msdn.microsoft.com/en-us/library/aa933227 (v = sql.80) .aspx) está pensado para comparar con' null', nada más. – RobIII

+0

@RobIII Acabo de copiar las dos afirmaciones, no lo vi. De todos modos él puede simplificar lo mismo que escribí en la cláusula if, es lo mismo – YvesR

3
IF datepart(hh, getdate()) >= 16 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 1 
    END 
ELSE 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 0 
    END 
+1

Por qué el feo casting de ida y vuelta (con el "magic [style-constant]" (http://msdn.microsoft.com/) en-us/library/aa226054 (v = sql.80) .aspx) "(ej.' 101') códigos que nadie puede recordar, varchar, un valor de tiempo en una cadena que incluye un espacio que, si se olvida, romperá todo, etc.) si hay funciones de fecha y hora? – RobIII

+0

@RobIII tienes razón, está arreglado. Solo estaba proporcionando otra forma de hacerlo, pero no dije que fuera la mejor manera. – Taryn

+1

He eliminado mi respuesta ya que ahora son esencialmente iguales. Pero publicaré la demostración aquí: http://www.sqlfiddle.com/#!3/96767/1. Tenga en cuenta que querrá '> = 16 ', de lo contrario, comenzará a las 5 p.m. – mellamokb

0
IF DATEPART(HOUR, GETDATE()) > 16 
BEGIN 
    -- SELECT statement 
END 
ELSE 
BEGIN 
    -- SELECT statement 
END 

No tiene que ser en un procedimiento almacenado.

+3

Comentando la respuesta de todos los demás y promocionando la tuya no es muy útil ni está orientado a la comunidad. Por favor absténgase de hacerlo en el futuro. – mellamokb

+0

Muy divertido, wildplasser. Y gracias, @mellamokb. – BoltClock

1

No conozco el dialecto-sintaxis exacto de MS, pero intentaré probar que no necesita una construcción IF o CASE. Tomé la respuesta de @mellamokb como un ejemplo.

SELECT * 
    FROM the_table 
WHERE (DATEPART(hour, GETDATE()) >= 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 1) 
    OR (DATEPART(hour, GETDATE()) < 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 0) 
    ; 
+0

Excepto que su "búsqueda para evitar un caso cuando/else" da como resultado una cláusula 'where 'que necesita varias evaluaciones para cada registro mientras que mi' case when ... 'se puede evaluar una vez y luego solo necesita una evaluación por registro – RobIII

1

La idea aquí es utilizar la regla de implicación de reescritura:

IF (x) THEN (y) is equivalent to (NOT (x) OR y) 

En su caso

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1) 

es equivalente a

(NOT (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

y es a su vez equivalente a

((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

Reescribiendo la cláusula original, ELSE como una declaración IF..THEN por derecho propio:

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0) 

es equivalente a (esta vez Omisión del paso intermedio)

((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) 

Los dos expresión puede entonces escribir en forma normal conjuntiva ("una serie de AND s)

SELECT * 
    FROM the_table 
WHERE ((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 
     AND 
     (((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) ; 
1

seleccione a.name, si (= a.is_active 't', 'activa', 'inactivo') a partir de mitabla un

Cuestiones relacionadas