在下面的查询中,我得到了“东京商人”订购日期的1月份的日期
我想知道“东京商人”没有获得订单的日期。
SELECT DATEPART(DAY, Orders.OrderDate)
FROM Orders
JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
JOIN Products ON OrderDetails.ProductID = Products.ProductID
JOIN Suppliers ON Suppliers.SupplierID = Products.SupplierID
WHERE Suppliers.CompanyName = 'Tokyo Traders'
AND DATEPART(MONTH, Orders.OrderDate) = 1
AND DATEPART(YEAR, Orders.OrderDate) = 1997;
答案 0 :(得分:1)
根据您的表名判断,如果您没有订单,我假设您没有任何缺少1月日期的表。
因此,我的查询的第一部分会生成1997年1月的所有日期,因此您有完整的列表。
现在,要从此列表中排除Tokyo Traders
订单的日期,我使用LEFT JOIN
并从订单表中排除NULL
个结果。
;WITH dates
AS (
SELECT CAST('01-JAN-1997' AS DATE) AS sdate
UNION ALL
SELECT dateadd(day, 1, sdate) AS sdate
FROM dates
WHERE dateadd(day, 1, sdate) < CAST('01-FEB-1997' AS DATE)
)
SELECT d.sdate AS [Full Day]
, DATEPART(DAY, d.sDate) AS [Day]
FROM dates d
LEFT JOIN Orders o
ON d.sDate = o.OrderDate
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
LEFT JOIN Products
ON OrderDetails.ProductID = Products.ProductID
LEFT JOIN Suppliers
ON Suppliers.SupplierID = Products.SupplierID
AND Suppliers.CompanyName = 'Tokyo Traders'
WHERE o.OrderDate IS NULL
答案 1 :(得分:0)
SELECT DATEADD(DAY,sv.number-1,DATEADD(MONTH, d.m-1,CONVERT(DATETIME,LTRIM(d.y)+'-01-01')))
,CASE WHEN Orders.OrderID IS NULL 'No order' ELSE 'Get Order' END
FROM master.dbo.spt_values AS sv
INNER JOIN (VALUES(1997,1)) d(y,m) ON 1=1
LEFT JOIN Orders ON DATEPART(MONTH, Orders.OrderDate) = d.m AND DATEPART(YEAR, Orders.OrderDate) = d.y
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID
LEFT JOIN Suppliers ON Suppliers.SupplierID = Products.SupplierID AND Suppliers.CompanyName = 'Tokyo Traders'
WHERE sv.type='P' AND sv.number BETWEEN 1 AND DATEPART(DAY, DATEADD(d,-1, DATEADD(MONTH, d.m,CONVERT(DATETIME,LTRIM(d.y)+'-01-01'))))
以下脚本用于生成日期序列,您可以生成多年和月份数据:
SELECT DATEADD(DAY,sv.number-1,DATEADD(MONTH, d.m-1,CONVERT(DATETIME,LTRIM(d.y)+'-01-01')))
FROM master.dbo.spt_values AS sv
INNER JOIN (VALUES(1997,1)) d(y,m) ON 1=1
WHERE sv.type='P' AND sv.number BETWEEN 1 AND DATEPART(DAY, DATEADD(d,-1, DATEADD(MONTH, d.m,CONVERT(DATETIME,LTRIM(d.y)+'-01-01'))))
----------------------- 1997-01-01 00:00:00.000 1997-01-02 00:00:00.000 1997-01-03 00:00:00.000 1997-01-04 00:00:00.000 1997-01-05 00:00:00.000 1997-01-06 00:00:00.000 1997-01-07 00:00:00.000 1997-01-08 00:00:00.000 1997-01-09 00:00:00.000 1997-01-10 00:00:00.000 1997-01-11 00:00:00.000 1997-01-12 00:00:00.000 1997-01-13 00:00:00.000 1997-01-14 00:00:00.000 1997-01-15 00:00:00.000 1997-01-16 00:00:00.000 1997-01-17 00:00:00.000 1997-01-18 00:00:00.000 1997-01-19 00:00:00.000 1997-01-20 00:00:00.000 1997-01-21 00:00:00.000 1997-01-22 00:00:00.000 1997-01-23 00:00:00.000 1997-01-24 00:00:00.000 1997-01-25 00:00:00.000 1997-01-26 00:00:00.000 1997-01-27 00:00:00.000 1997-01-28 00:00:00.000 1997-01-29 00:00:00.000 1997-01-30 00:00:00.000 1997-01-31 00:00:00.000
答案 2 :(得分:0)
Change the StartDate as per requirement
DECLARE @StartDate DATE
SET @StartDate = '20161201'
SELECT DATEADD(DAY,number,@StartDate ),DATEPART(DAY, Orders.OrderDate)
FROM master..spt_values
Left Outer Join Orders ON Orders.OrderDate=DATEADD(DAY,number,@StartDate )
Where type = 'P'
AND DATEPART(MONTH, DATEADD(DAY,number,@StartDate)) = 12
AND DATEPART(YEAR, DATEADD(DAY,number,@StartDate)) = 2016