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

时间:2019-02-07 02:39:22

标签: sql-server

使用T-SQL查询:

  1. 如何获得以下交货状态:

    a。准时交货
    b。提早交货
    C。延迟交货

  2. 如果custdate列为空,如何使用Proddate列进行大小写查询?

  3. 如何在使用案例声明时将装运日期的日期时间转换为日期?

我可以获得项目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

我期望以下输出:

1. Early
2. Late
3. On-Time (must convert to datetime to date format)
4. On-Time (based on proddate)
5.Early
6.On-Time

3 个答案:

答案 0 :(得分:0)

DATEDIFF(day, Shipmentdate, Custdate) = 0

COALESCE(CustDate, ProdDate)

我相信这是您正在寻找的两个功能。我在电话上,请原谅任何错字。

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

COALESCE将返回第一个非null值。

答案 1 :(得分:0)

由于您的ShipmentDate包含日期和时间,因此您需要先转换为date数据类型,然后再进行比较。

对于ID 4,您还为CustDate分配了一个空字符串。将其转换为1900-01-01并存储在表中。如果您仅存储NULL,将会更容易。否则,您需要使用case when语句检查1900-01-01值或NULLIF()。 因此,要根据您的数据进行处理,请使用isnull(nullif(CustDate, '1900-01-01'), ProdDate)表达式

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

答案 2 :(得分:0)

您可以尝试以下查询。

 ALTER DATABASE YourDB SET DEFAULT 'SOMEDATE' FOR TYPE DATETIME