将日期转换为天

时间:2021-02-10 13:38:31

标签: sql oracle plsql

我希望将以下以 ETL 编写的查询转换为 Oracle sql。请帮忙。

WITH b1 AS (
SELECT b.fap_inr_idr, b.lod_tmp FROM to_cnf_pye_bse b GROUP BY b.fap_inr_idr, b.lod_tmp
), b2 AS (
SELECT TO_DATE(DATE_SUB(TO_DATE(lod_tmp), DAY(TO_DATE(lod_tmp)) - 1)) AS req_month, b1.* FROM b1
)
SELECT req_month, count(*) AS volume
FROM b2
WHERE req_month < '2021-01-01'
GROUP BY req_month
ORDER BY req_month;

1 个答案:

答案 0 :(得分:0)

您的日期计算公式“日期 -(月中的天数 - 1)”的结果是当月的第一天。因此,您的示例日期 03/04/1993 将导致日期 03/01/1993(假设日期格式为 mm/dd/yyyy)。整个查询然后获取前几个月的行数。因此假设您的列 lod_tmp 是 SqlServer 默认日期格式 'yyyy-mm-dd' 中的字符串,那么您的公式:

SELECT TO_DATE(DATE_SUB(TO_DATE(lod_tmp), DAY(TO_DATE(lod_tmp)) - 1)) AS req_month  

翻译为 Oracle

select trunc( to_date(lod_tmp, 'yyyy-mm-dd'), 'mm') req_month. 

我不确定在带有聚合函数的 SqlServer 中的 GROUP BY 实际上是做什么的,但在 Oracle 中是消除重复项,我假设 SqlServer 也是如此。如果是这样,请尝试:

     alter session set nls_date_format = 'yyyy-mm-dd'; 
     with b1 as 
         ( select b.fap_inr_idr, b.lod_tmp  
             from to_cnf_pye_bse b 
             group by b.fap_inr_idr, b.lod_tmp
         ) 
    select trunc(to_date(lod_tmp), 'mm') req_month, count(*) 
      from b1 
     where trunc( to_date(lod_tmp, 'mm') < date '2021-01-01' 
     group by trunc( to_date(lod_tmp, 'mm')
     order by 1;

If you do not want or cannot set nls_data_format then use trunc(to_date(lod_tmp,'yyyy-mm-dd'), 'mm') ;