Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Tengo una consulta específica creada y almacenada en Oracle como una vista:
SELECT
TEAM_ASSIGNED
, REPORT_YEAR
, REPORT_MONTH
, REPORT_MONTH_NUM
, REPORT_DAY
, REPORT_DAY_NUM
, REPORT_DATE
, REPORT_PERIOD_FLAG
, INCOMING
, TRIAGE_AND_TRANSFERRED
, RESOLVED
, BALANCE
FROM SCHEMA_NAME.VW_CRM_INCIDENTS_HISTORY
WHERE 1=1
AND REPORT_DATE = '01/NOV/20'
Los tipos de datos son:
TEAM_ASSIGNED VARCHAR2(256)
REPORT_YEAR VARCHAR2(4)
REPORT_MONTH VARCHAR2(3)
REPORT_MONTH_NUM VARCHAR2(2)
REPORT_DAY VARCHAR2(9)
REPORT_DAY_NUM VARCHAR2(2)
REPORT_DATE DATE
REPORT_PERIOD_FLAG CHAR(14)
INCOMING NUMBER
TRIAGE_AND_TRANSFERRED NUMBER
RESOLVED NUMBER
BALANCE NUMBER
Cuando ejecuto la consulta anterior en Oracle, obtengo cero resultados (como se esperaba). Sin embargo, cuando ejecuto la consulta en Power BI, obtengo varios miles de filas!
Al quitar el filtro de fechas se muestra que todas las fechas REPORT_DATE han tenido un desplazamiento de -1 día para ellos. Lo que es aún más extraño es que el valor REPORT_DAY se muestra como SUNDAY aunque no haya absolutamente ningún domingo en el conjunto de datos. La siguiente función es lo que se utiliza para crear el campo REPORT_DAY:
, CASE WHEN TO_CHAR(TRANSACTION_DATE,'D') = 6
THEN TO_CHAR(TRANSACTION_DATE + 2,'DAY')
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'D') = 7
THEN TO_CHAR(TRANSACTION_DATE + 1,'DAY')
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'HH24') >= 17
AND TO_CHAR(TRANSACTION_DATE + 1,'D') = 6
THEN TO_CHAR(TRANSACTION_DATE + 3,'DAY')
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'HH24') >= 17
THEN TO_CHAR(TRANSACTION_DATE + 1,'DAY')
ELSE TO_CHAR(TRANSACTION_DATE,'DAY')
END END END END AS REPORT_DAY
Puede ver que estamos moviendo explícitamente el REPORT_DAY hacia adelante hasta el lunes donde es sábado, o domingo, o viernes después de las 5 p. m.
Mi sospecha es que Power BI está analizando de alguna manera toda la vista en Power BI antes de enviarla al analizador de Oracle Query para que se ejecute. De este modo, se utilizan los valores de zona horaria y fecha internos de Power BI (por ejemplo, NLS de Power BI) en lugar del servidor de Oracle para el que se supone que se ejecuta la consulta.
¿Es esto cierto, o hay otra explicación, y alguien tiene un método para resolver este problema?
PD: Debo mencionar que la función REPORT_DATE es la siguiente:
, CASE WHEN TO_CHAR(TRANSACTION_DATE,'D') = 6
THEN TRUNC(TRANSACTION_DATE + 2)
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'D') = 7
THEN TRUNC(TRANSACTION_DATE + 1)
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'HH24') >= 17
AND TO_CHAR(TRANSACTION_DATE + 1,'D') = 6
THEN TRUNC(TRANSACTION_DATE + 3)
ELSE
CASE WHEN TO_CHAR(TRANSACTION_DATE,'HH24') >= 17
THEN TRUNC(TRANSACTION_DATE + 1)
ELSE TRUNC(TRANSACTION_DATE)
END END END END AS REPORT_DATE
actualizar:
He reducido el problema a la declaración 'D' de la función TO_CHAR:
Solved! Go to Solution.
Así que trabajar alrededor es quitar todas las referencias a TO_CHAR([DATE],'D') y en su lugar usar TO_CHAR([DATE],'DY') Solo puedo suponer que esto es porque los servidores de Power BI comienzan sus semanas el domingo en lugar del lunes, y por lo tanto todos los números de día comienzan un día antes. Afortunadamente, los nombres de día permanecen iguales, por lo que puede utilizar la función DY para buscar MON para comenzar su semana.
Así que trabajar alrededor es quitar todas las referencias a TO_CHAR([DATE],'D') y en su lugar usar TO_CHAR([DATE],'DY') Solo puedo suponer que esto es porque los servidores de Power BI comienzan sus semanas el domingo en lugar del lunes, y por lo tanto todos los números de día comienzan un día antes. Afortunadamente, los nombres de día permanecen iguales, por lo que puede utilizar la función DY para buscar MON para comenzar su semana.
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |