10
votes

Si condition dans une requête SQL

Je suis un débutant sur SQL Server. Aidez-moi s'il vous plaît à écrire la logique suivante dans une requête.

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


0 commentaires

8 Réponses :


0
votes

Vous avez besoin d'une procédure stockée pour le faire dans SQL. Jetez un coup d'œil aux docs ici http: // msdn .microsoft.com / fr-US / US / Bibliothèque / AA174792 (V = SQL.80) .aspx


0 commentaires

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

SELECT *
FROM table
WHERE MailDate is Tomorrow

ELSE

SELECT *
FROM table
WHERE MailDate is Today
This is MS SQL. If you want to do more then just one command/select inside the if you do BEGIN .... END.

2 commentaires

Depuis quand MSSQL prend-il en charge MSSQL où maildate est demain ou où maildate est aujourd'hui ? En outre, le est opérateur est destiné à comparer à null , rien d'autre.


@ROBIII Je viens de copier la dernière déclaration, je n'ai pas vu cela. Quoi qu'il en soit, il peut vous simplifier la même chose que j'ai écrit dans la clause Si, c'est juste la même chose



3
votes
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

4 commentaires

Pourquoi la moulée laidule de retour en arrière (avec la "magie Constant de style " (par exemple, 101 ) Personne ne peut jamais se souvenir, Varchars, une timbre dans une chaîne comprenant un espace qui, sibliottenu, brisera tout, etc.) Si Il y a des fonctions DateTime?


@Robiii vous avez raison, il est corrigé. Je fournis juste une autre façon de le faire, mais je n'ai pas dit que c'était le meilleur moyen.


J'ai supprimé ma réponse depuis qu'ils sont maintenant essentiellement les mêmes. Mais je posterai la démo ici: sqlfiddle.com/#!3/96767/1 . Notez que vous voulez > = 16 sinon vous commencez à 17h.


@mellamokb merci d'avoir souligné le> = Évidemment j'ai manqué ça. Je n'ai pas réalisé qu'ils étaient la même chose après mon première modification. Je me sentais à la sourcie à enlever les convertis. Je sais qu'ils ne sont pas les meilleurs de convertir et d'aller de retour, je montrais juste une autre façon laid. :)



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

2 commentaires

Hey robiii, mon pote. Je voulais juste dire que je vous ai upvote, mais les bowvotes peuvent être le résultat des conversations de ce poste. Ne le prenez pas personnellement, nous pouvons tous apprendre toujours quelque chose :) N'oubliez pas de penser à penser à ce que vous dites lorsque vous le posez et considérez comment cela pourrait appartenir aux autres. I et d'autres d'autres personnes s'efforcent de faire une communauté amicale qui accueille tous les niveaux de compétence et donne à chacun une chance. On dirait que le vôtre a été marqué comme la réponse également, alors félicitations et passez une bonne journée!


Roblll, je t'ai précipité et si cela vous fait sentir mieux, je voudrais dire que j'ai mis en œuvre votre code car il avait l'air très efficace. Bien sûr, il m'a fallu un moment pour que je le comprenne. :) Merci beaucoup



0
votes
IF DATEPART(HOUR, GETDATE()) > 16
BEGIN
    -- SELECT statement
END
ELSE 
BEGIN
    -- SELECT statement
END
It does not have to be in a stored procedure.

1 commentaires

Commentant la réponse de tous les autres et la promotion de votre propre n'est pas très utile ou orientée communautaire. S'il vous plaît s'abstenir de le faire à l'avenir.



1
votes

Je ne connais pas le dialecte exact MS-Syntax-TableCt, mais je vais essayer de prouver que vous n'avez pas besoin d'une construction IF ou de cas. J'ai pris la réponse de @mellamokb comme exemple. XXX


1 commentaires

Sauf que votre " quête pour éviter un cas lorsque / else " donne dans un où la clause qui nécessite plusieurs évaluations à effectuer pour chaque enregistrement alors que mon document quand. .. peut être évalué une fois et n'a besoin que d'une seule évaluation par enregistrement.



1
votes

L'idée ici est d'utiliser la règle de réécriture impliciteuse: xxx

dans votre cas xxx

est équivalent à xxx

et est lui-même équivalent à xxx

ré-écrire l'original ele clause sous forme de Si..then instruction dans son propre droit: xxx

est équivalent à (ce temps omettant l'étape intermédiaire) xxx

L'expression deux peut alors être enrichir sous forme normale conjonctive ("une série de et s) xxx


0 commentaires

1
votes

Sélectionnez A.Name, si (a.is_active = 't', 'actif', "inactif") de MyTable A


0 commentaires