You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

构建库存系统SQL查询:计算产品过期日期及解决查询结果异常问题

解决你的库存系统SQL查询问题

咱们一步一步来搞定你遇到的两个核心问题:查询结果重复,以及如何计算并输出符合要求的过期日期!

一、搞定查询结果重复的问题

你当前的查询返回重复内容,大概率是以下两个原因之一:

  • 没筛选特定人员:你的目标是获取特定人员的产品信息,但原查询没加WHERE条件,导致返回了所有人员的记录;
  • Table2存在重复的ProductID:如果Table2里同一个ProductID对应多条保质期记录,内连接后就会产生重复行。

先给你修正后的基础查询,加上特定人员的筛选,同时确保只关联唯一的产品保质期数据:

SELECT 
    [Table1].[Person ID], 
    [Table1].[ProductID], 
    [Table1].[Receive date], 
    [Table2].[Lifespan]
FROM 
    [Table1]
INNER JOIN 
    [Table2] ON [Table2].ProductID = [Table1].[ProductID]
WHERE 
    [Table1].[Person ID] = 1; -- 这里替换成你要查询的目标人员ID

如果加了筛选还是有重复,建议检查Table2,把ProductID设为主键或唯一约束,避免同一产品出现多条保质期记录。

二、计算并输出日期格式的过期日期

不同SQL数据库的日期加减语法略有差异,我给你列几种常用场景的实现方式:

1. SQL Server(使用DATEADD函数)

SELECT 
    [Table1].[Person ID], 
    [Table1].[ProductID], 
    [Table1].[Receive date], 
    [Table2].[Lifespan],
    DATEADD(year, [Table2].[Lifespan], [Table1].[Receive date]) AS ExpirationDate -- 计算并生成过期日期
FROM 
    [Table1]
INNER JOIN 
    [Table2] ON [Table2].ProductID = [Table1].[ProductID]
WHERE 
    [Table1].[Person ID] = 1;

2. MySQL(使用DATE_ADD或直接加INTERVAL)

SELECT 
    Table1.`Person ID`, 
    Table1.ProductID, 
    Table1.`Receive date`, 
    Table2.Lifespan,
    DATE_ADD(Table1.`Receive date`, INTERVAL Table2.Lifespan YEAR) AS ExpirationDate
-- 也可以简写:Table1.`Receive date` + INTERVAL Table2.Lifespan YEAR AS ExpirationDate
FROM 
    Table1
INNER JOIN 
    Table2 ON Table2.ProductID = Table1.ProductID
WHERE 
    Table1.`Person ID` = 1;

3. PostgreSQL(使用+ INTERVAL转换)

SELECT 
    "Person ID", 
    ProductID, 
    "Receive date", 
    Lifespan,
    "Receive date" + (Lifespan || ' years')::INTERVAL AS ExpirationDate
FROM 
    Table1
INNER JOIN 
    Table2 ON Table2.ProductID = Table1.ProductID
WHERE 
    "Person ID" = 1;

额外小提示

  • 确认Receive date字段是数据库能识别的日期类型(比如DATE、DATETIME),如果是字符串格式,需要先用CASTCONVERT函数转换为日期类型再计算;
  • 如果需要筛选已过期的产品,可以在WHERE里追加条件,比如SQL Server可以写DATEADD(year, [Table2].[Lifespan], [Table1].[Receive date]) < GETDATE()

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

火山引擎 最新活动