2012-06-28 123 views
4

我寫了以下查詢,但是在WHERE子句中,我已經使用了日期範圍的特定日期。我希望日期範圍能夠自動計算 - 也就是說,截至今天的日期爲90天。我該怎麼做?WHERE子句中的日期範圍從90天前到今天的日期

SELECT Orders.Day, 
Orders.Month, 
Orders.Year, 
Orders.Orders_Count,Orders.PaymentAmount, 
Orders.Total_Payment_Authorized, 
Orders.ShipCity, 
Orders.Total_Payment_Received, 
Orders.SalesTax1, 
Orders.SalesTax2, 
Orders.SalesTax3, 
Orders.TotalShippingCost, 
Orders.OrderDetails_Count, 
Orders.Quantity, 
Orders.COGS, 
Orders.Profit, 
Orders.ProfitMargin 
FROM (SELECT Orders.Day,Orders.Month,Orders.Year,Orders.Orders_Count, Orders.PaymentAmount,Orders.Total_Payment_Authorized,Orders.ShipCity,Orders.Total_Payment_Received,Orders.SalesTax1,Orders.SalesTax2,Orders.SalesTax3, Orders.TotalShippingCost,OrderDetails.OrderDetails_Count, OrderDetails.Quantity,OrderDetails.COGS,OrderDetails.Profit,OrderDetails.ProfitMargin 
FROM (SELECT DATEPART(DD, Orders.OrderDate) AS Day, DATEPART(MM, Orders.OrderDate) AS Month,DATEPART(YY, Orders.OrderDate) AS Year, Max(Orders.OrderDate) As OrderDate ,Max(Orders.ShipDate) As ShipDate, Count(Orders.OrderID) As Orders_Count, Sum(Orders.PaymentAmount) AS PaymentAmount, Sum(Orders.Total_Payment_Authorized) AS Total_Payment_Authorized,Orders.ShipCity AS ShipCity, 
Sum(Orders.Total_Payment_Received) AS Total_Payment_Received, Sum(Orders.SalesTax1) AS SalesTax1,Sum(Orders.SalesTax2) AS SalesTax2 , Sum(Orders.SalesTax3) AS SalesTax3, Sum(Orders.TotalShippingCost) AS TotalShippingCost 
FROM (((Orders WITH(NOLOCK) LEFT JOIN PaymentMethods WITH(NOLOCK) ON Orders.PaymentMethodID = PaymentMethods.PaymentMethodID) 
LEFT JOIN ShippingMethods WITH(NOLOCK) ON Orders.ShippingMethodID = ShippingMethods.ShippingMethodID) 
LEFT JOIN Customers WITH(NOLOCK) ON Orders.CustomerID = Customers.CustomerID)  
WHERE Orders.OrderStatus <> 'Cancelled' GROUP BY Orders.ShipCity, DATEPART(DD, Orders.OrderDate),DATEPART(MM, Orders.OrderDate),DATEPART(YY, Orders.OrderDate)) Orders 
INNER JOIN (SELECT DATEPART(DD, Orders.OrderDate) AS Day,DATEPART(MM, Orders.OrderDate) AS Month,DATEPART(YY, Orders.OrderDate) AS Year, Count(OrderDetails.OrderDetailID) As OrderDetails_Count, 
Sum(OrderDetails.Quantity) AS Quantity, Sum(OrderDetails.Vendor_Price * OrderDetails.Quantity) AS COGS, 
Case When SUM(Vendor_Price) IS NULL Then null Else Sum((Case When OrderDetails.ProductCode like 'DSC-%' Then 
OrderDetails.ProductPrice - ISNULL(OrderDetails.Vendor_Price,0) 
Else OrderDetails.ProductPrice - OrderDetails.Vendor_Price End) * OrderDetails.Quantity) End AS Profit,  
CASE SUM(OrderDetails.ProductPrice * OrderDetails.Quantity) WHEN 0 THEN 0  
ELSE ROUND(((SUM(OrderDetails.ProductPrice * OrderDetails.Quantity) - SUM(OrderDetails.Vendor_Price * OrderDetails.Quantity))/SUM(OrderDetails.ProductPrice * OrderDetails.Quantity)) * 100, 1) END AS ProfitMargin  
FROM (((Orders WITH(NOLOCK) LEFT JOIN PaymentMethods WITH(NOLOCK) ON Orders.PaymentMethodID = PaymentMethods.PaymentMethodID)  
LEFT JOIN ShippingMethods WITH(NOLOCK) ON Orders.ShippingMethodID = ShippingMethods.ShippingMethodID) LEFT JOIN Customers  
WITH(NOLOCK) ON Orders.CustomerID = Customers.CustomerID) LEFT JOIN OrderDetails WITH(NOLOCK) ON Orders.OrderID = OrderDetails.OrderID  
WHERE Orders.OrderStatus <> 'Cancelled' AND DATEDIFF(dd, Orders.OrderDate, '03/01/2012') <= 0 AND DATEDIFF(dd, Orders.OrderDate, '06/30/2012') >= 0 AND Orders.ShipPostalCode IN ('96704','96710','96718','96719','96720','96721','96725','96726','96727','96728','96737','96738','96739','96740','96743','96745','96749','96750','96755','96760','96764','96771','96772','96773','96774','96776','96777','96778','96780','96781','96783','96785') 
GROUP BY Orders.ShipCity, DATEPART(DD, Orders.OrderDate),DATEPART(MM, Orders.OrderDate), DATEPART(YY, Orders.OrderDate)) OrderDetails ON Orders.Day = OrderDetails.Day AND Orders.Month = OrderDetails.Month AND Orders.Year = OrderDetails.Year) Orders 
ORDER BY Orders.Day DESC, Orders.Month DESC,Orders.Year DESC 
+2

你真的不把你的SQL查詢保存在這麼混亂嗎? –

+0

這不是今天的90天 - 這是從過去3個月到過去2天的121天。你今天想要一個90天的窗口,或者你現在擁有的東西嗎?如果是後者,實際的規則是什麼? –

+0

我想要一個90天的日期範圍。我剛剛在上面的查詢中顯示了120天的示例。 – user818671

回答

7

如果它是微軟SQL 2000和最多(05,08,10)。然後只需使用: 其中YourDate> =(GETDATE() - 90)

-1
select * from mytable where mydate > date_sub(now(), interval 90 day) 
0

如果你想,直到「當月結束」,這是「當前的前3個月的月初」一切從你現在確實有,你可以使用DATEDIFFDATEADD在一起:

WHERE 
    Orders.OrderDate >= DATEADD(month,DATEDIFF(month,20010101,CURRENT_TIMESTAMP),'20001001') and 
    Orders.OrderDate < DATEADD(month,DATEDIFF(month,20010101,CURRENT_TIMESTAMP),'20010201') 

雖然我不知道這是什麼意思爲OrderDate是在未來。

日期文字是經過精心挑選的,它們之間有我們正在尋找的關係 - 例如, 20001001是20010101之前3個月的開始。20010201是20010101之前1個月的開始。