You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从每日存储的库存数据中获取商品价格最后变动日期?

如何提取商品价格最后一次变动的日期?

我明白你现在的需求:从每日存储的Stock、Price、Saved数据中,找到商品最后一次价格发生变动的日期——也就是价格从旧值切换到当前最新值的那一天。在你的示例数据里,期望得到的是8/7/2019 12:01:01 AM,这是价格从28首次变为31的日期。

你的原代码问题出在哪?

你的原代码输出错误,大概率是因为数据没有按日期从新到旧排序,或者循环逻辑没有从最新的记录开始往后比对。如果数据库返回的记录是按日期从旧到新排列的,你的循环会在第一次碰到价格变化时就输出旧的日期,而不是我们需要的最后一次变动日期。

另外,你当前用字符串存储日期,无法正确进行排序和比较,这也是潜在的问题点。

修正后的解决方案

步骤1:先确保数据按日期从新到旧排序

首先把字符串类型的saved转换为DateTime,再按日期降序排列,保证最新的记录在最前面:

// 将字符串日期转为DateTime,再按日期从新到旧排序
var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList();

步骤2:遍历找到最后一次变动的日期

从最新的记录开始,找到第一个价格和当前最新价格不同的记录,它的前一条记录的日期就是最后一次变动的日期;如果所有价格都相同,说明该商品价格从未变动过。

修正后的完整代码:

namespace StackOverFlowQ2
{
    class Program
    {
        public class Inventory
        {
            public string stock { get; set; }
            public string price { get; set; }
            public string saved { get; set; }
        }
        static void Main(string[] args)
        {
            var inv = new List<Inventory> {
                new Inventory { stock = "Apple", price = "31", saved = "8/10/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "31", saved = "8/9/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "31", saved = "8/8/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "31", saved = "8/7/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "28", saved = "8/6/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "28", saved = "8/5/2019 12:01:01 AM" },
                new Inventory { stock = "Apple", price = "28", saved = "8/4/2019 12:01:01 AM" }
            };

            #region 修正后的Solution
            // 1. 按日期从新到旧排序
            var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList();
            if (!sortedInv.Any()) return;

            // 2. 获取当前最新价格
            var latestPrice = sortedInv.First().price;
            DateTime? lastChangeDate = null;

            // 3. 遍历查找第一个价格不同的记录
            for (int i = 1; i < sortedInv.Count; i++)
            {
                if (sortedInv[i].price != latestPrice)
                {
                    // 前一条记录的日期就是最后一次变动的日期
                    lastChangeDate = DateTime.Parse(sortedInv[i-1].saved);
                    break;
                }
            }

            // 4. 输出结果
            if (lastChangeDate == null)
            {
                Console.WriteLine($"商品{sortedInv.First().stock}价格从未变动过,最早记录日期:{sortedInv.Last().saved}");
            }
            else
            {
                Console.WriteLine(lastChangeDate.Value.ToString("M/d/yyyy h:mm:ss tt"));
            }
            #endregion
        }
    }
}

更简洁的LINQ写法

如果你偏好LINQ风格,可以用下面的代码实现同样的逻辑:

var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList();
if (!sortedInv.Any()) return;

var latestPrice = sortedInv.First().price;
var firstDifferentRecord = sortedInv.Skip(1).FirstOrDefault(x => x.price != latestPrice);

if (firstDifferentRecord != null)
{
    var changeDate = sortedInv[sortedInv.IndexOf(firstDifferentRecord) - 1].saved;
    Console.WriteLine(changeDate);
}
else
{
    Console.WriteLine($"商品{sortedInv.First().stock}价格从未变动过,最早记录日期:{sortedInv.Last().saved}");
}

运行结果

用你的示例数据测试,以上代码都会输出:8/7/2019 12:01:01 AM,完全符合你的期望。

内容的提问来源于stack exchange,提问作者DotNetFullStack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:15:11