如何根据某个日期间隔更新表中的值?

时间:2018-02-12 07:30:22

标签: c# mysql

所以我有一个价格的产品表。 我只想在日期间隔更新该价格。

实施例: 苹果是10 从2018-02-02到2018-03-02我想将价格更新为12。

我提到我创建了第二个表PriceInterval来插入日期间隔。  enter code here Pseudocode for my sqlscript

1 个答案:

答案 0 :(得分:0)

希望我能正确理解这个问题。您所描述的内容的可能解决方案将意味着稍微更改架构。在两个日期之间的新价格的产品区间中有一个新字段允许您在间隔结束时保持默认价格。并使用查询根据日期选择价格。

DROP TABLE IF EXISTS product_intervals;
DROP TABLE IF EXISTS products;

CREATE TABLE products (
    ID  INT NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(50) NOT NULL,
    Price DECIMAL(18,1) NOT NULL,
    CONSTRAINT pkProductId PRIMARY KEY (ID)
);

CREATE TABLE product_intervals (
    ID INT NOT NULL AUTO_INCREMENT,
    ProductId INT NOT NULL,
    DateTo DATETIME NOT NULL,
    DateFrom DATETIME NOT NULL,
    NewPrice DECIMAL(18,1) NOT NULL,
    CONSTRAINT pkProductIntervalId PRIMARY KEY (ID),
    CONSTRAINT fkProductId FOREIGN KEY (ProductId) REFERENCES `products`(`ID`) ON DELETE CASCADE
);

INSERT INTO products (`Name`, Price)
              SELECT 'Apple', 0.10
    UNION ALL SELECT 'Banana', 0.20;

INSERT INTO product_intervals (ProductId, DateTo, DateFrom, NewPrice)
    SELECT 2, STR_TO_DATE('2018-02-10T00:00:00','%Y-%m-%dT%H:%i:%s'), STR_TO_DATE('2018-02-15T00:00:00','%Y-%m-%dT%H:%i:%s'), 0.30;


select p.`Name`, CASE WHEN pi.NewPrice IS NOT NULL THEN pi.NewPrice ELSE p.Price END AS Price
FROM products p
left join product_intervals pi ON p.ID = pi.ProductId AND DateFrom > NOW() AND DateTo < NOW();

关键部分是左连接和选择查询中的CASE语句。此代码尚未经过全面测试,因此可能需要进行一些调整,但希望能够很好地说明解决方案的内容。