SQL:我需要使用一个Case格式将Select Distinct语句格式化为值之一

时间:2019-03-13 15:33:20

标签: sql oracle format

因此,我试图从具有以下时间格式的表中选择不同的运算符:“ MM / DD / YYYY HH:MI:SS AM”。

逻辑是这样的:

(if C_StartTime >= date(C_StartTime) + 6:00:00 AM 
AND C_StartTime < date(C_StartTime) + 5:59:59AM 
then C_StartTime,'MM/DD/YYYY' 
ELSE (C_StartTime,'MM/DD/YYYY')-1)
AS DateOnly

我现在可以选择不同的运营商,但他们每天登录和注销几次,因此时间有所不同。应当注意,这家公司的“今天”是3/13/19 6:00:00 AM到3/14/19 5:59:59 AM。

下面是我尝试执行的最终代码

SELECT
  DISTINCT (
    (
      CASE WHEN C_StartTime >= date(C_StartTime) +.25
         AND C_StartTime < date(C_StartTime) +.9999 
         THEN date(C_StartTime) 
         ELSE date(C_StartTime) -1
    ) as DateOnly,
    C_operator,
    C_operatorname,
    C_WorkCentreName
    FROM
      OPERATORTABLE
    WHERE
      .....

编辑>>>>>>

This is what I get.

This is what I need

我正在寻找操作员编号,操作员姓名和日期(知道1/4/2019 5:59:00 AM = 1/3/2019

1 个答案:

答案 0 :(得分:0)

我认为您可能正在采取类似trunc(c_starttime - 6/24) + 6/24之类的方法来让一天从凌晨6点开始,而不是午夜:

WITH dts AS (SELECT to_date('13/03/2019 05:59:59', 'dd/mm/yyyy hh24:mi:ss') dt FROM dual UNION ALL
             SELECT to_date('13/03/2019 06:00:00', 'dd/mm/yyyy hh24:mi:ss') dt FROM dual UNION ALL
             SELECT to_date('13/03/2019 06:00:01', 'dd/mm/yyyy hh24:mi:ss') dt FROM dual UNION ALL
             SELECT to_date('14/03/2019 05:59:59', 'dd/mm/yyyy hh24:mi:ss') dt FROM dual UNION ALL
             SELECT to_date('14/03/2019 06:00:00', 'dd/mm/yyyy hh24:mi:ss') dt FROM dual)
SELECT dt,
       dt - 6/24 adj_dt,
       TRUNC(dt - 6/24) trunc_adj_dt,
       TRUNC(dt - 6/24) + 6/24 adj_start_of_dt
FROM   dts;

DT                  ADJ_DT              TRUNC_ADJ_DT        ADJ_START_OF_DT
------------------- ------------------- ------------------- -------------------
13/03/2019 05:59:59 12/03/2019 23:59:59 12/03/2019 00:00:00 12/03/2019 06:00:00
13/03/2019 06:00:00 13/03/2019 00:00:00 13/03/2019 00:00:00 13/03/2019 06:00:00
13/03/2019 06:00:01 13/03/2019 00:00:01 13/03/2019 00:00:00 13/03/2019 06:00:00
14/03/2019 05:59:59 13/03/2019 23:59:59 13/03/2019 00:00:00 13/03/2019 06:00:00
14/03/2019 06:00:00 14/03/2019 00:00:00 14/03/2019 00:00:00 14/03/2019 06:00:00

我选择了adj_dt和trunc_adj_dt列,以便您可以看到如何根据原始dt列计算adj_start_of_dt列。

您可能不需要在开始日期列中的凌晨6点输出,因此您可以跳过该列(例如,在这种情况下,trunc_adj_dt是您要在该列之后的位置)。