Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

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.

Reply
jakubk
Helper I
Helper I

validar la fecha usando dax

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?"

1 ACCEPTED 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
    )

View solution in original post

10 REPLIES 10
Anonymous
Not applicable

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:

image.png

Luego creamos una medida como esta:

Measure = IFERROR(
            IF(HASONEVALUE('Table'[Date]),
                DATEVALUE(VALUES('Table'[Date])),
                ""),
                "")

Terminaremos con algo como esto:

image.png

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)

Anonymous
Not applicable

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)


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
amitchandak
Super User
Super User

@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

Anonymous
Not applicable

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:

FechaMedida
2020-08-142/2/2019 0:00
2020-08-33Fecha no válida
2019-02-028/14/2020 0:00
2019-02-30Fecha no válida

¿Ayuda?

Greg_Deckler
Super User
Super User

@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.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

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...


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.