Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAP HANA SQL-星期天开始一周?默认情况下,WEEK()从星期一开始_Sql_Hana - Fatal编程技术网

SAP HANA SQL-星期天开始一周?默认情况下,WEEK()从星期一开始

SAP HANA SQL-星期天开始一周?默认情况下,WEEK()从星期一开始,sql,hana,Sql,Hana,业务需要从周日开始,但SAP HANA SQL周从周一开始。如何在周日开始日历周?我发现一些网页表明这是一个问题,例如,但没有解决方案 这里的CALWEEK已经在表中,所以我将重点介绍CALWEEK_。 创建一个函数: CREATE OR REPLACE FUNCTION non_iso_week(in_date DATE) RETURNS week INTEGER LANGUAGE SQLSCRIPT AS BEGIN week := CASE EXTRACT(DOW FROM in_da

业务需要从周日开始,但SAP HANA SQL周从周一开始。如何在周日开始日历周?我发现一些网页表明这是一个问题,例如,但没有解决方案

这里的CALWEEK已经在表中,所以我将重点介绍CALWEEK_。 创建一个函数:

CREATE OR REPLACE FUNCTION non_iso_week(in_date DATE)
RETURNS week INTEGER LANGUAGE SQLSCRIPT AS BEGIN
  week := CASE EXTRACT(DOW FROM in_date)
            WHEN 0 THEN WEEK(in_date) +1
            ELSE WEEK(in_date)
          END;
END;
然后:


以下措施奏效了。请注意,派生的星期日开始周是CALWEEK,其他列用于帮助验证

此解决方案需要存在_SYS_BI.M_TIME_维度,该维度可能必须根据此文档底部的注释生成

我包括在2017年周日开始的特殊处理-查找工作日至_DATECONCATYEARdate _sap,'-01-01',YYYY-MM-DD'=6

我将审查以下内容:

本年度2020年 边缘案例1:当一年从星期天开始 边缘案例2:当一年从周六开始 从1900年到2100年的验证SQL 本年度2020年 -检查是否有任何异常CALWEEK值期望1-53=>成功

select distinct count(*) as RECORDS_PER_CALWEEK from #CALWEEK_TEST
group by CALWEEK;
select distinct SUBSTRING(CALWEEK, 5) as WEEKONLY from #CALWEEK_TEST
order by WEEKONLY;

在这里,一个较短的变量考虑了年初的拐角情况,无需辅助表:

CREATE OR replace FUNCTION week_sunday(DATE date) RETURNS ret integer AS BEGIN 
    ret = CASE weekday(extract(YEAR FROM date)||'-01-01')
          WHEN 6 THEN
            CASE weekday(date)
            WHEN 6 THEN week(date)
            ELSE week(date)-1
            END
          ELSE
            CASE weekday(date)
            WHEN 6 THEN week(date)+1
            ELSE week(date)
            END
        END;
END;

SAP DBTech JDBC的函数创建代码失败:[257]:sql语法错误:返回附近的语法不正确:第2行第1列,位置59。仔细检查了SAP HANA函数创建语法-并相应修改。如果将1月1日周六与1月2日周日进行比较,我认为这在2011年不起作用。你能检查一下吗?当前的函数创建代码为我返回了一个错误:SAP DBTECTJDBC:(257):SQL语法错误:DOW附近的错误语法:POS 129中的第3行COL 24应该是星期日而不是从日期提取,但是该解决方案不考虑年开始/结束的角情况。
-- Same SQL but use:
where date_sap >= TO_DATE('2016-12-20', 'YYYY-MM-DD') 
      and date_sap <= TO_DATE('2017-01-16', 'YYYY-MM-DD') 
-- need the ability to create a temporary table
drop table #CALWEEK_TEST;

create local temporary table #CALWEEK_TEST as (
select date_sap, YEAR(date_sap) as year_date_sap, WEEKDAY(date_sap) as weekday_date_sap, WEEK(date_sap) as SAPWEEK,
(CASE     
    -- subtract by 1 when week starts on a Sunday like in 2017
    when WEEKDAY(TO_DATE(CONCAT(YEAR(date_sap),'-01-01'), 'YYYY-MM-DD')) = 6 and
     ((YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap) + 1)) and (WEEKDAY(date_sap) != 6)) THEN CONCAT(YEAR(date_sap), WEEK(date_sap) - 1)
    when WEEKDAY(TO_DATE(CONCAT(YEAR(date_sap),'-01-01'), 'YYYY-MM-DD')) = 6 and
     ((YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap) + 1)) and (WEEKDAY(date_sap) = 6)) THEN CONCAT(YEAR(date_sap), WEEK(date_sap))
    when WEEKDAY(TO_DATE(CONCAT(YEAR(date_sap),'-01-01'), 'YYYY-MM-DD')) = 6 and
     YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap)) THEN CONCAT(YEAR(date_sap), WEEK(ADD_DAYS(date_sap, 1)) - 1)
    when ((YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap) + 1)) and (WEEKDAY(date_sap) != 6)) THEN CONCAT(YEAR(date_sap), WEEK(date_sap))
    when ((YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap) + 1)) and (WEEKDAY(date_sap) = 6)) THEN CONCAT(YEAR(date_sap), WEEK(date_sap) + 1)
    when YEAR(ADD_DAYS(date_sap, 1)) = (YEAR(date_sap)) THEN CONCAT(YEAR(date_sap), WEEK(ADD_DAYS(date_sap, 1)))
END) AS CALWEEK
from "_SYS_BI"."M_TIME_DIMENSION" 
-- to eliminate missing values (appears as "?")
  where date_sap >= TO_DATE('1900-01-01', 'YYYY-MM-DD') 
      and date_sap <= TO_DATE('2100-12-31', 'YYYY-MM-DD') 
      order by date_sap
);   
  
select distinct count(*) as RECORDS_PER_CALWEEK from #CALWEEK_TEST
group by CALWEEK;
select distinct SUBSTRING(CALWEEK, 5) as WEEKONLY from #CALWEEK_TEST
order by WEEKONLY;
CREATE OR replace FUNCTION week_sunday(DATE date) RETURNS ret integer AS BEGIN 
    ret = CASE weekday(extract(YEAR FROM date)||'-01-01')
          WHEN 6 THEN
            CASE weekday(date)
            WHEN 6 THEN week(date)
            ELSE week(date)-1
            END
          ELSE
            CASE weekday(date)
            WHEN 6 THEN week(date)+1
            ELSE week(date)
            END
        END;
END;