关于 DATE 的 Case When in Where 子句
Case When in Where Clause concerning DATE
您好,我正在尝试创建一个不考虑周末的报告。基本上今天加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'
”作为错误消息。
计划添加此内容以便在 visual studio 中过滤生成订单的报告。基于今天。这是整个当前查询:
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'
这就是我认为你想要实现的。如果今天加上 2 天是周末,那么您需要 4 天内发货日期的条目,如果今天加上 2 天是工作日,您需要 2 天内发货日期的条目。如果我是正确的,下面的 Where 语句应该可以解决问题。
WHERE
[Shipment Date] =
case when datepart(weekday,getdate() + 2) in (1,7) then getdate() + 4
else getdate() + 2 end
此代码是 WHERE
子句的一部分,这意味着此处的所有内容都必须解析为布尔值 "yes" 或 "no" 结果。
CASE
语句创建 值 。但是,SQL 语言没有真正的布尔值;它只有比较运算符。因此, CASE
本身不能产生完整的布尔表达式;它只能产生比较运算符一侧使用的值。
对于这个问题,我们的代码结构如下:
WHERE column = value AND CASE
如刚才所示,这不是值。 CASE
表达式的结果必须与某些东西进行比较,例如:
WHERE column = value AND CASE < column/value
此外,在生成这些值时,一个 CASE 表达式可以有多个 WHEN
部分。这里不需要嵌套多个 CASE 表达式。更好的是,我们使用一个 IN()
子句,那么每个 WHEN
的前半部分是相同的,后半部分是常量。
好的。所以我终于解决了这个问题,可以使用它正常工作:
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.[Shipment Date] 为 3/12/19 的所有行,即 = getdate()+4。
您好,我正在尝试创建一个不考虑周末的报告。基本上今天加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'
”作为错误消息。
计划添加此内容以便在 visual studio 中过滤生成订单的报告。基于今天。这是整个当前查询:
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'
这就是我认为你想要实现的。如果今天加上 2 天是周末,那么您需要 4 天内发货日期的条目,如果今天加上 2 天是工作日,您需要 2 天内发货日期的条目。如果我是正确的,下面的 Where 语句应该可以解决问题。
WHERE
[Shipment Date] =
case when datepart(weekday,getdate() + 2) in (1,7) then getdate() + 4
else getdate() + 2 end
此代码是 WHERE
子句的一部分,这意味着此处的所有内容都必须解析为布尔值 "yes" 或 "no" 结果。
CASE
语句创建 值 。但是,SQL 语言没有真正的布尔值;它只有比较运算符。因此, CASE
本身不能产生完整的布尔表达式;它只能产生比较运算符一侧使用的值。
对于这个问题,我们的代码结构如下:
WHERE column = value AND CASE
如刚才所示,这不是值。 CASE
表达式的结果必须与某些东西进行比较,例如:
WHERE column = value AND CASE < column/value
此外,在生成这些值时,一个 CASE 表达式可以有多个 WHEN
部分。这里不需要嵌套多个 CASE 表达式。更好的是,我们使用一个 IN()
子句,那么每个 WHEN
的前半部分是相同的,后半部分是常量。
好的。所以我终于解决了这个问题,可以使用它正常工作:
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.[Shipment Date] 为 3/12/19 的所有行,即 = getdate()+4。