Sql server 如何在SQL上获取交货日期状态?

Sql server 如何在SQL上获取交货日期状态?,sql-server,Sql Server,使用T-SQL查询: 如果发货交货日期为以下状态,如何获取该状态: a。准时交货 B提前交货 C迟交 如果custdate列为空,如何使用Proddate列进行案例查询 如何在使用case语句时将shipmentdate的datetime转换为date 我可以得到项目a和c的状态 DECLARE @tbl TABLE ( ID INT, ProdDate DATETIME,

使用T-SQL查询:

  • 如果发货交货日期为以下状态,如何获取该状态:

    a。准时交货
    B提前交货
    C迟交

  • 如果custdate列为空,如何使用Proddate列进行案例查询

  • 如何在使用case语句时将shipmentdate的datetime转换为date

  • 我可以得到项目a和c的状态

    DECLARE @tbl TABLE
                 (
                     ID INT,
                     ProdDate DATETIME,
                     CustDate DATETIME, 
                     ShipmentDate DATETIME
                 )
    
    INSERT INTO @tbl (ID, Proddate, CustDate, ShipmentDate)
    VALUES (1, '2018-04-11', '2018-04-14', '2018-04-13 14:48'),
           (2, '2018-05-15', '2018-05-10', '2018-05-11 14:48'),
           (3, '2018-05-15', '2018-05-16', '2018-05-16 14:48'),
           (4, '2018-06-8', ' ', '2018-06-8 14:48'),
           (5, '2018-04-11', '2018-04-14', '2018-04-13 14:48'),
           (6, '2018-04-11', '2018-04-14', '2018-04-14 00:00')
    
    SELECT 
        ID, proddate, custdate, shipmentdate,
        CASE 
           WHEN custdate = shipmentdate THEN 'ON TIME'
           WHEN custdate < shipmentdate THEN 'LATE'
        END AS status
    FROM
        @tbl
    
    我相信这是你正在寻找的两个功能。我正在打电话,请原谅我的打字错误

    带有day参数的DATEDIFF将比较返回天数差整数的日期,如果它们是同一天,则返回0


    COALESCE将返回第一个非空值。

    由于您的
    ShipmentDate
    包含日期和时间,您需要在比较之前转换为
    date
    数据类型

    同样对于ID 4,您为CustDate分配了一个空字符串。将其转换并作为
    1900-01-01
    存储在表中。如果只存储
    NULL
    ,会更容易。否则,您需要在语句时使用
    大小写来检查
    1900-01-01
    值或
    NULLIF()
    。 因此,要基于数据处理此问题,可以使用
    isnull(nullif(CustDate,'1900-01-01'),ProdDate)
    expression

    CASE 
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) > convert(date, ShipmentDate) then 'EARLY'
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) = convert(date, ShipmentDate) then 'ON TIME'
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) < convert(date, ShipmentDate) then 'LATE'
    end as status
    
    案例
    当isnull(nullif(CustDate,'1900-01-01'),ProdDate)>convert(date,ShipmentDate)时,则为'EARLY'
    当isnull(nullif(CustDate,'1900-01-01'),ProdDate)=转换(date,ShipmentDate)时,则为“准时”
    当isnull(nullif(CustDate,'1900-01-01'),ProdDate)
    您可以尝试以下查询

    SELECT ID, proddate,custdate,shipmentdate,
    CASE 
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) = CONVERT(DATE,shipmentdate,101) then 'ON TIME'
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) < CONVERT(DATE,shipmentdate,101) then 'LATE'
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) > CONVERT(DATE,shipmentdate,101) then 'Early'
    END AS STATUS
    FROM @tbl
    
    选择ID、proddate、custdate、shipmentdate、,
    案例
    当CONVERT(DATE,isnull(NULLIF(custdate.),ProdDate),101)=CONVERT(DATE,shipmentdate,101)时,则为“准时”
    当CONVERT(DATE,isnull(NULLIF(custdate),ProdDate),101)CONVERT(DATE,shipmentdate,101)时,则为'Early'
    以身份结束
    来自@tbl
    
    您好,您知道如何将此代码转换为excel或power BI吗?嘿@reborn,对不起,我在excel或power BI中不知道。
    CASE 
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) > convert(date, ShipmentDate) then 'EARLY'
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) = convert(date, ShipmentDate) then 'ON TIME'
    WHEN isnull(nullif(CustDate, '1900-01-01'), ProdDate) < convert(date, ShipmentDate) then 'LATE'
    end as status
    
    SELECT ID, proddate,custdate,shipmentdate,
    CASE 
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) = CONVERT(DATE,shipmentdate,101) then 'ON TIME'
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) < CONVERT(DATE,shipmentdate,101) then 'LATE'
    WHEN CONVERT(DATE,isnull(NULLIF(custdate,''),ProdDate),101) > CONVERT(DATE,shipmentdate,101) then 'Early'
    END AS STATUS
    FROM @tbl