我有一份需要处理日期的工作,例如: 一艘船仅在星期一至星期六离开装货港,如何在sql的字段中显示这些日期? 我尝试获取工作日和getdate(),但没有成功
CASE
WHEN PORT_ID = 333
THEN CONVERT(VARCHAR(15),DATEADD(D, preview_Date)),103) END AS 'date of load'
但是我需要根据日历将日期始终设置为星期一至星期六。
CASE
WHEN DATEPART(DW, CONVERT(DATE,departure_Date))) IN (2,3,4,5) AND harbor_id = 412
THEN CONVERT(VARCHAR(15),DATEADD(DAY, -8, CONVERT(DATE,departure_Date)))+ ' TO ' + CONVERT(VARCHAR(15),DATEADD(DAY,-4, CONVERT(DATE,departure_Date)))
END AS 'DEADLINE' ,
答案 0 :(得分:0)
您的问题对我来说还不是很清楚,所以我会做一些假设。如果它们不正确,请在评论中告诉我,以便我更改答案。
示例1:船舶出发= 15/12/2018(星期六),装载日期= 11/12/2018(星期二)
示例2:船舶出发= 17/12/2018(星期一),date_of_load = 12/12/2018(星期三)
您可以使用以下查询解决此问题。
它的工作原理如下:首先将DATEFIRST设置为1。SQL使用datefirst来确定如何对工作日进行编号。现在它将星期一定为第一天。 接下来,使用DATEPART函数确定出发日期是星期几。 如果出发日期是星期一,星期二,星期三,星期四(天数2、3、4、5),则我们减去5天即可得出date_of_load,以计算周日。否则我们减去4。
SET DATEFIRST 1 -- Set monday as day 1
SELECT Ship_Departure_Date,
CASE WHEN DATEPART(dw,Ship_Departure_Date) IN (1,2,3,4) --dw means 'day of the week'
THEN DATEADD(DAY, -5, Ship_Departure_Date)
ELSE DATEADD(DAY, -4, Ship_Departure_Date)
END AS date_of_load
FROM ShipDepartureList
即使这不能完全解决您的问题,我也希望这能指导您正确的方向。
答案 1 :(得分:0)
with块仅生成示例数据
WITH (
select GetUtcDate() as shipsaildate
Union all
select GetUtcDate() +1
Union all
select GetUtcDate() +2
Union all
select GetUtcDate() +3
Union all
select GetUtcDate() +4
Union all
select GetUtcDate() +5
Union all
select GetUtcDate() +6
Union all
select GetUtcDate() +7
) as departs
Select
shipsaildate,
shipsaildate -
case
when datepart(dw, shipsaildate) >= 6 then datepart(dw, shipsaildate) - 2
else 6
end as deadline
From departs
如果船舶在星期二星期三或星期四出发,则最后期限为提前6天(4个工作日)。如果船舶在周五或周日出发,则截止日期为相应的4、5或6天,
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0801ac47b0fcd11dfa9c2ee54001fa6a