出货日期作业

时间:2018-12-11 18:02:52

标签: sql

我有一份需要处理日期的工作,例如: 一艘船仅在星期一至星期六离开装货港,如何在sql的字段中显示这些日期? 我尝试获取工作日和getdate(),但没有成功

CASE
   WHEN PORT_ID = 333 
   THEN CONVERT(VARCHAR(15),DATEADD(D, preview_Date)),103) END AS 'date of load' 

但是我需要根据日历将日期始终设置为星期一至星期六。

Image Example

    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' , 

2 个答案:

答案 0 :(得分:0)

您的问题对我来说还不是很清楚,所以我会做一些假设。如果它们不正确,请在评论中告诉我,以便我更改答案。

    1. 您有船舶出发日期的列表
    1. 客户在出发日期之前有4个工作日(如果在星期日之间则为5个正常工作日)来运送货物
    1. 周日不能交货,周日船舶不出发

示例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