1

我们有一个项目价格文件,其中包含项目编号、价格生效日期和价格。我们将在今年年初涨价。我想要做的是现在添加价格记录,这将有一个较晚的生效日期,并根据当前日期选择当前价格。IE 当前日期是 08/03/11,我要拉取 ITEM1 01/01/09 记录:

1. ITEM1    01/01/01    100.00
2. ITEM1    01/01/05    150.00
3. ITEM1    01/01/09    200.00
4. ITEM1    01/01/12    250.00

一旦今年的第一天 - 01/01/12,我会选择 01/01/12 记录。

您不能使用 MIN 或 MAX 函数,因为它会提取第一条或最后一条记录,而不是正确的记录。

任何想法都非常感谢。

4

6 回答 6

4

试试这个:

select * from tb 
join (
        select tb.item, 
        MAX(tb.effDate) effDate
        from tb
        where tb.effDate <= currentDate
        group by tb.item
    ) tmp 
    on tb.item = tmp.item
    and tb.effDate = tmp.effDate

子查询将识别正确的行,而主查询将再次获取该行以获取价格。

于 2011-08-03T20:30:04.303 回答
0

您按日期按降序排列(以便最新记录在“顶部”),并用于WHERE过滤掉您所要求的日期之后的日期。LIMIT 子句(在 mySQL 的情况下)使结果集只有一行。所以查询就像

SELECT *
  FROM tab
  WHERE(Number = ITEM1)AND(Date <= CURRENT_DATE)
ORDER BY Date DESC
FETCH FIRST 1 ROW ONLY
于 2011-08-03T20:18:45.327 回答
0

SELECT * FROM Table WHERE Date >= '01/01/09'

于 2011-08-03T20:20:06.217 回答
0

试试这个:

SELECT item_number, MAX(price_effective_date)
  FROM items_table
WHERE price_effective_date <  current_date 
    GROUP BY item_number
于 2011-08-03T20:20:31.210 回答
0

如果您使用的是 VB.NET,这将非常容易。看起来您的字段由单个“”(空格)分隔。这会给你这样的东西:

Dim Record As String = "ITEM1 01/01/01 100.00 ITEM1 01/01/05 150.00 ITEM1 01/01/09 200.00 ITEM1 01/01/12 250.00"
Dim Fields() As String = Record.Split(" ")

Dim LastItemNo As String = Fields(Ubound(Fields) - 2)
Dim LastDate As Date = Date.Parse(Fields(Ubound(Fields) - ))
Dim LastPrice As Single = Val(Fields(Ubound(Fields)))

Debug.WriteLine("Item: " & LastItemNo & "; Date: " & Format(LastDate, "MM-dd-yyyy") & "; $" & Math.Round(LastPrice, 2))

在这种情况下,它将输出: Item: Item1; 日期:2012 年 1 月 1 日;$250.00

我希望这就是你要找的。

于 2011-08-03T20:22:42.227 回答
0

如果它只是 SQL 你需要尝试

SELECT [columname price] FROM [tablename] WHERE EXTRACT(YEAR FROM CURDATE()) = EXTRACT(YEAR FROM [columname date] ) limit 1

替换[columname]为持有数据的列女巫的名称

替换[tablename]为持有数据的表的名称

我相信这应该可以解决问题。

于 2011-08-03T20:23:46.803 回答