Как выбрать результаты на основе различных условий, включающих несколько дат в SQL? - PullRequest
1 голос
/ 22 января 2020

У меня есть таблица с элементами, похожими на следующие, которая содержит имена элементов, SoldDate (если продано) и DisplayInWebsiteDate (это дата, до которой этот элемент должен отображаться на веб-сайте, если не продан)

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

Я хочу ВЫБРАТЬ элементы, основанные на следующих условиях:

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

Сегодняшняя дата - 2020-01-22. Следовательно, результат будет следующим

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

Ожидаемый результат:

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

Ответы [ 3 ]

1 голос
/ 22 января 2020

Это должно быть довольно просто с помощью следующего утверждения:

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)

Тем не менее, вы можете параметризовать Дни и так далее ... но в основном я думаю, что это так.

См. SQL Fiddle для деталей: http://sqlfiddle.com/#! 18/36538/4/1

1 голос
/ 22 января 2020

Использование OR для обоих условий должно сделать это.

SELECT *
FROM YourTable t
WHERE (
    (SoldDate IS NULL AND DisplayInWebsiteDate > CAST(GetDate() AS DATE))
    OR 
    (SoldDate >= DATEADD(day,-30, CAST(GetDate() AS DATE)))
)
0 голосов
/ 22 января 2020

Работает ли это для вас:

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 Скрипач здесь

...