1
votes

Comment sélectionner les résultats en fonction de différentes conditions impliquant plusieurs dates en SQL?

J'ai un tableau avec des articles similaires au suivant qui contient les noms des articles, SoldDate (s'il est vendu) et DisplayInWebsiteDate (il s'agit de la date jusqu'à laquelle cet article doit être affiché sur le site Web s'il n'est pas vendu)

 Id      ItemName      IsSold       SoldDate        DisplayInWebsiteDate
 -------------------------------------------------------------------------
 1         Shirt         0            NULL              2020-03-28
 3         Jacket        1          2020-01-05          2020-01-20

Je souhaite SÉLECTIONNER les éléments en fonction des conditions suivantes:

1. Shirt is VALID because it is not sold, and DisplayInWebsiteDate is greater than today's date
2. Pant is INVALID because it is sold, so we ignore its DisplayInWebsiteDate. 
   And its sold date has passed more than 30 days form today's date
3. Jacket is VALID because it was sold just 17 days ago i.e it falls within range of 30 days sold date
4. Trouser is INVALID because it is not sold and its DisplayInWebsiteDate has already passed on January 10, 2020

La date d'aujourd'hui est le 22/01/2020. Par conséquent, le résultat serait le suivant

1. If item is not Sold i.e SoldDate is NULL then check if its DisplayInWebsiteDate is 
   greater than current date and that would be valid

2. If item is Sold i.e SoldDate has some date then ignore DisplayInWebsiteDate and check if that item was 
   sold within last 30 days, and display. If it was sold more than 30 days earlier, then don't get that record

Résultat attendu:

Id      ItemName      IsSold       SoldDate        DisplayInWebsiteDate
-------------------------------------------------------------------------
1         Shirt         0            NULL              2020-03-28
2         Pant          1          2019-10-20          2020-04-25
3         Jacket        1          2020-01-05          2020-01-20
4         Trouser       0            NULL              2020-01-10


2 commentaires

spécifiez également le résultat attendu.


@jarlh j'ai mis à jour le résultat attendu


3 Réponses :


0
votes

Cela fonctionne-t-il pour vous:

SELECT [Id], [ItemName],  [IsSold], [SoldDate], [DisplayInWebsiteDate]
FROM tbl
WHERE ([ISSOLD] <> 1 AND (CAST([DisplayInWebsiteDate] as date) >= CAST(GETDATE() as DATE))
       OR
       ([ISSOLD] = 1 AND DATEDIFF(day, [SoldDate], CAST(GETDATE() as DATE)) <= 30))

SQL Fiddler est ici


2 commentaires

Non, cela ne fonctionne pas car il vérifie DisplayInWebsiteDate avec la date du jour pour tous les éléments et ne satisfait donc pas la condition numéro 2 que j'ai mentionnée


@Vim Veuillez vérifier. J'ai mis à jour ma réponse et ajouté un violoneux.



1
votes

Cela devrait être assez simple via la déclaration suivante:

CREATE TABLE t(
  ID int,
  ItemName nvarchar(100),
  IsSold int,
  SoldDate datetime,
  DisplayInWebsiteDate datetime
)

INSERT INTO t VALUES
(1, 'Shirt', 0, NULL, '2020-03-28')
,(2, 'Pant', 1, '2019-10-20', '2020-04-25')
,(3, 'Jacket', 1, '2020-01-05', '2020-01-20')
,(4, 'Trouser', 0, NULL, '2020-01-10');


SELECT *
  FROM t
  WHERE (SoldDate IS NULL AND DisplayInWebsiteDate > GETDATE())
    OR (SoldDate IS NOT NULL AND DateDiff(d, SoldDate, GETDATE()) <= 30)

Cependant, vous pouvez paramétrer les jours et ainsi de suite ... mais en gros je pense que c'est tout.

Voir SQL Fiddle pour plus de détails: http://sqlfiddle.com/#!18/36538 / 4/1


0 commentaires

1
votes

L'utilisation d'un OU pour les deux conditions devrait le faire.

SELECT *
FROM YourTable t
WHERE (
    (SoldDate IS NULL AND DisplayInWebsiteDate > CAST(GetDate() AS DATE))
    OR 
    (SoldDate >= DATEADD(day,-30, CAST(GetDate() AS DATE)))
)


1 commentaires

@Vim De rien. :) Btw, si c'est une grande table et qu'il y a un index sur SoldDate alors cette alternative devrait se révéler la plus rapide. S'il n'y a pas d'index sur la date de vente, cela n'a probablement pas d'importance.