首页 > 解决方案 > oracle sql如何获取星期几

问题描述

我有以下查询获取日期的星期几:

SELECT   pdm.serie, rta.matricula_ant, TO_CHAR (fecha, 'ww') semana,
         SUM (rta.kms_acumulados) kms,
           COUNT
              (DISTINCT (CASE
                    WHEN v.secuencia BETWEEN rta.sec_origen AND rta.sec_destino
                       THEN v.cod_inc
                    ELSE '0'
                 END
                )
              )
         - 1 numincidencias
    FROM (SELECT ms.tren, ms.fecha_origen_tren, ms.secuencia, ri.cod_inc
            FROM r_incidencias ri, mer_sitra ms
           WHERE ri.cod_serv = ms.tren
             AND ri.fecha_origen_tren = ms.fecha_origen_tren
             AND ri.cod_tipoin IN (SELECT cod_tipo_iincidencia
                                     FROM v_tipos_incidencias
                                    WHERE grupo = '45')
             AND ri.punto_desde = ms.cod_estacion) v,
         r_trenes_asignar rta,
         r_maquinas rm,
         planificador.pl_dh_material pdm
   WHERE rta.fecha BETWEEN TO_DATE ('21/09/2018', 'dd/mm/yyyy') AND TO_DATE ('21/09/2018',
                                                                  'dd/mm/yyyy'
                                                                 )
     AND rta.serie >= 4000
     AND rta.matricula_ant IS NOT NULL
     AND rm.matricula_maq = rta.matricula_ant
     AND rm.cod_serie = pdm.id_material
     AND rta.grafico BETWEEN pdm.desde AND pdm.hasta
     AND v.tren(+) = rta.tren
     AND v.fecha_origen_tren(+) = rta.fecha
GROUP BY pdm.serie, rta.matricula_ant, TO_CHAR (fecha,  'ww')
ORDER BY pdm.serie, rta.matricula_ant, TO_CHAR (fecha, 'ww')

例如第 1 周

我要显示

第 1 周:1 月 1 日 - 1 月 7 日

我怎样才能得到这个?

标签: oracledatetime

解决方案


Oracle 提供TRUNC(datestamp, format)以这种方式操作日期的功能。您可以使用各种格式字符串来获取季度、年份甚至小时的第一天。

给定一个特定的日期戳值,Oracle 将返回当前一周第一天的午夜,并使用以下表达式:

  TRUNC(datestamp,'DY')

您可以在日期戳中添加天数。因此,这个表达式在一周的最后一天给你午夜

  TRUNC(datestamp,'DY') + 6 

本周所有行的 WHERE 子句选择器可能是这个。

  WHERE datestamp >= TRUNC(SYSDATE,'DY')
    AND datestamp < TRUNC(SYSDATE,'DY') + 7

请注意,该范围的结束点恰好在<下周第一天的 ( ) 午夜之前。您需要它,因为您可能在一周的最后一天午夜之后有日期戳。(注意使用BETWEEN日期戳范围。)

和,

SELECT TO_CHAR(TRUNC(SYSDATE,'DY'),'YYYY-MM-DD'),
       TO_CHAR(TRUNC(SYSDATE,'DY')+6,'YYYY-MM-DD')
  FROM DUAL;

以类似 ISO 的格式显示本周的第一个和最后一个日期。

日期算术很酷。每年至少研究一次 DBMS 中的日期算术函数是值得的。


推荐阅读