使用T-SQL查询:
如何获得以下交货状态:
a。准时交货
b。提早交货
C。延迟交货
如果custdate列为空,如何使用Proddate列进行大小写查询?
如何在使用案例声明时将装运日期的日期时间转换为日期?
我可以获得项目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
答案 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