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 conexión en vivo
Necesito identificar qué filas contienen fechas no válidas en una columna de cadena determinada. el formato de fecha debe ser AAAA-mm-dd
No puedo hacerlo en la consulta de origen
Pensé que lo tenía con date() pero me quedé atrapado cuando dejó 2020-14-08 aunque. Aparentemente esto es 2021-02-08??? No estoy seguro de haber visto ese calendario. Solía usar dateadd para ese tipo de funcionalidad en lugar de sobrecargar los componentes de mes y día...
¿Sugerencias?
Mi código actual es
Date Check Calc2 =
// need to create as a measure because dax functions on live connections are nerfed
var rawDate = min(Table[Date_Col])
return switch(true(),
isblank(rawDate),2,
isERROR(date(LEFT(rawDate,4),MID(rawDate,6,2),MID(rawDate,9,2))) || MID(rawDate,5,1) <> "-" || MID(rawDate,8,1) <> "-" ,1,
0)
Ya siento que es demasiado tiempo para una pregunta tan simple. "¿Puedes hacer de esto una fecha basada en esta máscara de formato?"
Solved! Go to Solution.
sí, tanto los meses como los días que están fuera de los límites del mes se tratan como dateadd() que no es lo que quiero
Creo que me di cuenta de esto ayer - la mejor manera de comprobar es convertir la fecha analizada a una cadena en el formato esperado y asegurarse de que coincidan
Date Check Calc =
VAR rawDate =
MIN ( Table[RawData] )
RETURN
SWITCH (
TRUE (),
// Blank dates aren't an error but surface it differently to OK dates
ISBLANK ( rawDate ), 2,
// try to parse the date using hardcoded char locations. The date() parser is too forgiving - convert the date back to text and compare it to the raw value to make sure it hasn't been time travelled
FORMAT (
IFERROR (
DATE ( LEFT ( rawDate, 4 ), MID ( rawDate, 6, 2 ), MID ( rawDate, 9, 2 ) ),
BLANK ()
),
"YYYY-mm-dd"
) <> rawDate, 1,
0
)
No estoy seguro de por qué mi respuesta anterior a este post se perdió ... Voy a tratar de enviar de nuevo
Mi pensamiento inicial era que hay algunos valores de "fecha" de su origen que eran anormales y no existe en el calendario - Si ese es el caso, sugeriría convertir el valor del texto directamente y usar la función IFERROR() a los errores.
Digamos, la tabla de origen se parece a esto:
Luego creamos una medida como esta:
Measure = IFERROR(
IF(HASONEVALUE('Table'[Date]),
DATEVALUE(VALUES('Table'[Date])),
""),
"")
Terminaremos con algo como esto:
Espero que esto ayude
yeh, recibí un correo electrónico que respondiste (y uno en español también???), pero luego no lo vi en el hilo
Necesito restringirlo al formato AAAA-mm-dd porque necesito capturar días y meses transpuestos. Parece que datevalue() seguirá probando diferentes máscaras de formato hasta que encuentre una que funcione (12 de jan se convierte en 1 dec)
Tengo tu punto. La razón por la que 2021-02-08 cuando los datos alimentados fueron 2020-14-08 fue que la función Date() añadiría el mes al año si el entero que representa el mes es superior a 12 ...
Según mi opinión, lo que está buscando es cómo validar los datos antes de procesar los datos, como dijo que le gustaría extraer la parte de fecha de la fuente (pero ¿qué le gustaría hacer si descubrió que la fecha no es válida? Al igual que el caso 2020-14-08?) Entonces esta es una manera de verlo:
Measure = VAR Input = VALUES('Table'[Date])
VAR _position_1 = FIND("-",Input)
VAR _position_2 = FIND("-",Input,_position_1 + 1)
VAR _year = LEFT(Input,_position_1-1)
VAR _month = MID(Input,_position_1+1,_position_2 - _position_1 - 1)
VAR _day = RIGHT(Input,LEN(Input)-_position_2)
VAR _date = DATE(_year,_month,_day)
RETURN IF(
HASONEVALUE('Table'[Date]),
IF(FORMAT(_date,"yyyy-mm-dd") == Input,Input,"error message ... or something you would like to do with the invalide date"),
"error message ...")
En resumen, descompongo la fecha de entrada en dateparts y luego uso la función Date() para generar una nueva fecha. Si estos dos son idénticos, entonces suponemos que la cadena de entrada está en el formato correcto ... entonces usted puede seguir adelante con el formato verificado.
El punto es ... ¿qué le gustaría hacer con la fecha en formato invalide (por ejemplo, 2020-14-08)? Creo que hay muy poco que podamos hacer ......
sí, tanto los meses como los días que están fuera de los límites del mes se tratan como dateadd() que no es lo que quiero
Creo que me di cuenta de esto ayer - la mejor manera de comprobar es convertir la fecha analizada a una cadena en el formato esperado y asegurarse de que coincidan
Date Check Calc =
VAR rawDate =
MIN ( Table[RawData] )
RETURN
SWITCH (
TRUE (),
// Blank dates aren't an error but surface it differently to OK dates
ISBLANK ( rawDate ), 2,
// try to parse the date using hardcoded char locations. The date() parser is too forgiving - convert the date back to text and compare it to the raw value to make sure it hasn't been time travelled
FORMAT (
IFERROR (
DATE ( LEFT ( rawDate, 4 ), MID ( rawDate, 6, 2 ), MID ( rawDate, 9, 2 ) ),
BLANK ()
),
"YYYY-mm-dd"
) <> rawDate, 1,
0
)
@jakubk - En realidad parece que potencialmente podría ser mucho más complejo que lo que tienes hoy en día. Usted podría analizar el mes y el día y el año a través de la función DAX MID, función DERECHA y probablemente ENCONTRAR / BUSCAR posiblemente junto con SUSTITUTO. Es posible que deba implementar la lógica para determinar el estado del año bisiesto- https://community.powerbi.com/t5/Quick-Measures-Gallery/Leap-Year/m-p/442398#M159 pero probablemente no.
Ahora usted estaría en una posición para determinar si mes > 12, así como si los días excedieron el número de días en un mes,
IF(DAY(EOMONTH(DATE(__year, __month, 1),0) > __day, FAIL!!, pass)
@jakubk, lo que se esperan. Un cheque
if(len([col] <12, blank(), [col])
Ahora esta tabla se puede marcar como fecha en la consulta de energía con el error igonre.
¿Puede compartir datos de muestra y
Mi pensamiento inicial era que hay algunos valores de "fecha" de su origen que son anormales y no existen en el calendario - Si ese es el caso, sugeriría convertir el valor del texto directamente y usar la función IFERROR() a los errores.
Digamos, la tabla de origen se parece a esto:
Fecha
2020-08-14
2020-08-33
2019-02-02
2019-02-30
Luego creamos una medida DAX como esta:
Medidas ?
IFERROR(
SI(
HASONEVALUE('Tabla'[Fecha]),
DATEVALUE(VALUES('Table'[Date])),
"") ,
"Fecha no válida")
Con eso, terminaremos con una mesa como esta:
Fecha | Medida |
2020-08-14 | 2/2/2019 0:00 |
2020-08-33 | Fecha no válida |
2019-02-02 | 8/14/2020 0:00 |
2019-02-30 | Fecha no válida |
¿Ayuda?
@jakubk - Probablemente podría pensar en algo en DAX, pero tal vez simplemente duplicar la columna, dividir la columna en Power Query, comprobar si el valor medio es < ?
No estoy seguro de qué tipo de problemas está viendo en sus datos.
Perdí mi respuesta a un "error inesperado ocurrido, aquí va de nuevo"
que va a funcionar durante el mes, pero ¿qué pasa con la fecha de la amiga dax de hoy? febrero 207?
Mi fuente es un ERP con una columna personalizada agregada - desafortunadamente todas las columnas definidas personalizadas son varchar sin restricciones de máscara de formato, por lo que a veces las fechas transpuestas pasan
Terminé dividiendo la comprobación date() y usando format(iferror(col,blank()),"YYYY-mm-dd") <> col para convertir .valid' se remonta a mi formato original y compararlo con el valor original para asegurarse de que no ha sido tiempo viajado. Bleh, odio que me hagan escribir código enrevesado
@jakubk - Sí, tal vez DAX es mejor, podría extraer el mes mediante el análisis de texto y podría comprobar el escenario de fin de mes usando EOMONTH tal vez. Sin ofender, pero eso suena como un sistema ERP jankey...
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 |