获取月份sql server的剩余日期

时间:2016-12-16 07:54:31

标签: sql-server

在下面的查询中,我得到了“东京商人”订购日期的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;

3 个答案:

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