2016-12-16 8 views
0

をヶ月、SQL Serverの日付を残りの取得私は日付する月1月の日付を取得しました '東京トレイダーズ私は日付を取得したい以下のクエリでは

順ました「東京トレイダーズのdidn」に関する注文を得る。

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 
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 

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