Случай, когда в пункт, где в отношении даты - PullRequest
0 голосов
/ 07 марта 2019

Привет. Я пытаюсь создать отчет, который не учитывает выходные. В основном сегодня плюс 2 дня, исключая выходные. Но у меня проблемы с этим.

 Where [Location Code]='MO3TRAILS'
 and
      Case when datepart(weekday,[Shipment Date]+2)='1'then [Shipment Date]+4 
 else
      Case when datepart(weekday,[Shipment Date]+2)= '7' then [Shipment Date]+4 
 else
      [Shipment Date]+2 end end

Я получаю "An expression of non-boolean type specified in a context where a condition is expected, near 'end'" как сообщение об ошибке.

Запланируйте добавление, чтобы отфильтровать отчет в визуальной студии для заказов на строительство. на основании сегодняшнего дня. Вот весь текущий запрос:

SELECT        CASE WHEN h.[Sent To WMS] = '1' THEN 'YES' ELSE 'NO' END AS 
'Ready to Ship'
        , h.[Internal Comment]
        , CASE WHEN h.[Customer Price Group] <> 'INTERNAL' AND l.[No_] 
LIKE 'P-%' THEN l.[Gen_ Prod_ Posting Group] ELSE 
          CASE WHEN l.[No_] LIKE 'H-%' THEN l.[Gen_ Prod_ Posting Group] 
ELSE '' END END AS 'POS/Repack'
        , h.No_
        , h.[Ship-to Name]
        , h.[Bill-to Name]
        , l.[Location Code]
        , h.[Pool Load]
        , h.[Shipping Agent Code]
        , l.No_ AS 'SKU'
        , CAST(ROUND(l.[Quantity (Base)], 0) AS INT) AS 'QTY'
        , CAST(ROUND(m.[Qty_ per Unit of Measure], 0) AS INT) AS 'ITEMS 
PER PALLET'
        , CAST(CONVERT(varchar, h.[Shipment Date], 101) AS date) AS 'Slot 
Date'
        , h.[Ship-to County], ROUND(l.[Gross Weight], 0) AS 'Weight'
        , CASE WHEN l.[No_] LIKE 'F-00%' THEN FLOOR(l.[Quantity (Base)] / 
m.[Qty_ per Unit of Measure]) ELSE 0 END AS [Full Pallet]
        , CASE WHEN l.[No_] LIKE 'F-00%' THEN CAST(ROUND(l.[Quantity 
(Base)], 0) AS INT)- FLOOR(l.[Quantity (Base)] / m.[Qty_ per Unit of 
Measure]) * CAST(ROUND(m.[Qty_ per Unit of Measure], 0) AS INT) ELSE 0 END 
AS Picks
        , l.[Quantity (Base)] / m.[Qty_ per Unit of Measure] AS [Pallet 
Spots]

FROM            DATASERVER.[Dynamics NAV].dbo.[Sales Header] AS 
h INNER JOIN
            DATASERVER.[Dynamics NAV].dbo.[Sales Line] AS l ON 
h.No_ = l.[Document No_] INNER JOIN
            DATASERVER.[Dynamics NAV].dbo.[Item Unit of Measure] 
AS m ON l.No_ = m.[Item No_]

WHERE        (l.[Location Code] = 'MO3TRAILS') 
          AND (m.Code = 'PALLET') 
          AND (l.[Location Code] <> 'ECW') 
          AND (m.[Item No_] <> 'D-000006') 
          AND (m.[Item No_] <> 'D-000008')

ORDER BY 'Slot Date'

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Этот код является частью предложения WHERE, означающего, что все здесь должно преобразовываться в логический результат "да" или "нет".

CASE операторы создают значения .Однако язык SQL не имеет реальных логических значений;у него есть только операторы сравнения.Следовательно, CASE само по себе не может произвести полное логическое выражение;он может производить только значение, используемое на одной стороне оператора сравнения.

Для этого вопроса у нас есть код, структурированный так:

WHERE column = value AND CASE

Как только что показано, это не значение.Результат выражения CASE должен сравниваться с чем-либо, например:

 WHERE column = value AND CASE < column/value

Кроме того, при создании этих значений выражение CASE может иметь более одного раздела WHEN.Здесь нет необходимости вкладывать несколько выражений CASE.Еще лучше, если мы используем предложение IN(), тогда первая часть каждого WHEN одинакова, а последняя часть постоянна.

0 голосов
/ 08 марта 2019

OK.Итак, я, наконец, разобрался с этим для правильной работы, используя это:

          WHERE h.[Shipment Date]= CASE WHEN datepart(weekday,GETDATE()+2)IN (1) THEN (datediff(DAY,-4,getdate()))
          ELSE CASE WHEN datepart(weekday,GETDATE()+2)IN (7) THEN (datediff(DAY,-4,getdate())) ELSE (datediff(DAY,-2,getdate())) END END

При использовании этого возвращаются все строки, которые имеют h. [Дата отгрузки] 3/12/19, что = getdate () + 4.

0 голосов
/ 08 марта 2019

Это то, чего, я думаю, ты хочешь достичь. Если сегодня плюс 2 дня - выходные, то вы хотите, чтобы записи с датой отгрузки составляли 4 дня, а если сегодня плюс 2 дня - это рабочий день, вам нужны записи с датой отгрузки через 2 дня. Если я прав, следующее заявление Where должно сработать.

    WHERE 
[Shipment Date] =
    case when datepart(weekday,getdate() + 2) in (1,7) then getdate() + 4
    else  getdate() + 2 end
...