2011-11-27 44 views
0

我正在使用SQL Server 2005.我有一个名为Product的表。现在我需要找出某个月某个产品的价格。无论月底产品的价格是多少,都是价格。为了使场景更清楚,我有下面的例子:SQL Server显示历史数据

CREATE TABLE Product(ProductID int, Product Varchar(50), Price Decimal(5,2), FromDate DateTime, ToDate Datetime); 

数据可能看起来像如下:

INSERT INTO Product(ProductID, Product, Price, FromDate, ToDate) 
SELECT 1,Pen,2.99,'01/15/2011','03/25/2011' 
UNION 
SELECT 2,Pen,3.99,'03/25/2011','05/02/2011' 
UNION 
SELECT 3,Pen,4.99,'05/02/2011',NULL 

现在这里,笔目前的价格是4.99,因为它的TODATE仍然是空。现在1月份和2月份Pen的价格为2.99。 3月25日笔的价格变为3.99,所以3月份笔的价格为3.99。笔的价格在五月份再次改为4.99。所以5月份和5月份笔的价格是5月份。

现在,我需要编写一个sql脚本,它会给我给定月份的产品价格。任何帮助,将不胜感激。

+0

Fromdate可能是NULL吗? – Sparky

+0

看到这个:http://data.stackexchange.com/stackoverflow/s/2167/get-current-price –

+0

没有Fromdate永远不会是NULL – niceApp

回答

0
SELECT * From Product where @monthenddate 
between FROMDATE and isNUll(TODate,get date()) 

我要把它留给你来计算一个月的最后一天

+0

它似乎工作。谢谢你斯帕克。 – niceApp

+0

这个问题的一个问题是,如果你把'05/02/2011'作为@monthenddate,你会得到两个结果。只要您的输入可以保证不在范围的端点上,或者您可以修复数据,以确保没有重叠 –

+0

的真实情况,但是请求是获得特定月份和月份的价格被假定为本月的最后一天。从理论上讲,你永远不会根据他所要求的内容输入2011年5月2日... – Sparky

0

下面的工作,但你应该注意,如果输入是5/02/2011,那么价格将是4.99。如果你希望它是3.99只是改变比较opperators是<和> =

Select price 
From 
      Product 
Where 
      Product = 'Pen' 
      And fromdate <= @inputDate 
     And (todate > @inputDate or todate is null) 

看到它Data.SE

+0

我不认为这会奏效。因为假设我将值'04/01/2011'作为@inputDate来确定2011年4月份笔的价格。现在您的脚本将返回值4.99,这是不正确的。 2011年4月的钢笔价格为3.99。 – niceApp

+0

@mrp doh看起来像我扭转了我的操作员对此感到抱歉 –