【问题标题】:How to create a sql script to consider two columns?如何创建一个 sql 脚本来考虑两列?
【发布时间】:2026-01-04 11:25:02
【问题描述】:

假设今天的日期是 2014 年 1 月 22 日 我运行了一个报告,该表在下面(表),但输入范围为 SIdate 仅限 2014 年 1 月 1 日至 2014 年 1 月 18 日。

我想根据我输入的 SIdate 显示所有行,即 2014 年 1 月 1 日至 2014 年 1 月 18 日,但还应考虑 CMdate 并应传递日期参数。

正如您在表 2(我想要的输出)中注意到的那样,第 6 行不再存在 bcore CMdate 是 Jan 21, 2014

表 1

Emp   SIDate    item  TotQty      TotAmt     CMDate     CMAmt 
-------------------------------------------------------
CLO   01-01-14   item1  120       1500.00      null     null
CLO   01-02-14   item2   80        500.00     01-05-14   20.00
CLO   01-05-14   item6   21       1100.00      null     null
CLO   01-10-14   item5  100       2000.00     01-10-14  200.00
CLO   01-12-14   item9  300        100.00      null     null
CLO   01-16-14   item3  150        650.00     01-21-14  150.00

表 2(所需输出)

Emp   SIDate    item  TotQty      TotAmt     CMDate     CMAmt 
-------------------------------------------------------
CLO   01-01-14   item1  120       1500.00      null     null
CLO   01-02-14   item2   80        500.00     01-05-14   20.00
CLO   01-05-14   item6   21       1100.00      null     null
CLO   01-10-14   item5  100       2000.00     01-10-14  200.00
CLO   01-12-14   item9  300        100.00      null     null

非常感谢任何意见。

【问题讨论】:

  • 所有答案都有很大帮助。谢谢大家:)

标签: mysql sql date select where-clause


【解决方案1】:

试试这个:

SELECT a.Emp, a.SIDate, a.item, a.TotQty, a.TotAmt, a.CMDate, a.CMAmt 
FROM tableA 
WHERE DATE_FORMAT(a.SIDate, '%m-%d-%Y') BETWEEN '2014-01-01' AND '2014-01-18' AND 
      1 = (CASE WHEN a.CMDate IS NULL THEN 1 
                WHEN DATE_FORMAT(a.CMDate, '%m-%d-%Y') BETWEEN '2014-01-01' AND '2014-01-18' THEN 1 
                ELSE 0
           END)

【讨论】:

    【解决方案2】:

    您需要在两列上重复过滤器,可选择允许 NULL CMDate

    SELECT 
        Emp, SIDate, item, TotQty, TotAmt, CMDate, CMAmt 
    FROM 
        Table1
    WHERE 
       SIDate BETWEEN '2014-01-01' AND '2014-01-18'
       AND (CMDate IS NULL OR CMDate BETWEEN '2014-01-01' AND '2014-01-18');
    

    Fiddle here

    (顺便说一句,使用ISO 之类的标准作为日期格式将大大有助于避免与日期格式相关的问题)

    【讨论】:

      【解决方案3】:

      应该这样做:

      SELECT * FROM TABLE WHERE (CMDate IS NULL OR (CMDate >= MIN(SIDate) AND CMDate <= MAX(SIDate));

      【讨论】:

        【解决方案4】:
        select * from table where (cmdate between '01-01-2014' and '18-01-2014' or cmdate  is null) and sidate between '01-01-2014' and '18-01-2014' 
        

        【讨论】:

          【解决方案5】:
          SELECT tbl.*
          FROM Table1 AS tbl
          WHERE tbl.SIDate >= '01-01-14' AND tbl.SIDate <='01-18-14'
          AND tbl.CMDate >= '01-01-14' AND tbl.CMDate <='01-18-14'
          

          SELECT tbl.*
          FROM Table1 AS tbl
          WHERE tbl.SIDate BETWEEN '01-01-14' AND '01-19-14'
          AND tbl.CMDate BETWEEN '01-01-14' AND '01-19-14'
          

          【讨论】: