{"id":64,"date":"2017-11-04T15:52:37","date_gmt":"2017-11-04T15:52:37","guid":{"rendered":"https:\/\/trainingpowerbi.wordpress.com\/?p=64"},"modified":"2019-07-16T14:51:59","modified_gmt":"2019-07-16T12:51:59","slug":"dimension-temporal-en-m","status":"publish","type":"post","link":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/","title":{"rendered":"Dimensi\u00f3n temporal en M"},"content":{"rendered":"<p>Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la <strong>dimensi\u00f3n temporal<\/strong>. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo. La pregunta es:<\/p>\n<blockquote><p>\u00bfNecesito una tabla separada como dimensi\u00f3n temporal en el modelo de datos, o me vale con usar las jerarqu\u00edas autom\u00e1ticas que me ofrecen estas herramientas?<\/p><\/blockquote>\n<p><!--more--><\/p>\n<p>La respuesta, en mi humilde opini\u00f3n, es que es muy recomendable, independientemente de la complejidad del modelo de datos, tener una tabla separada como dimensi\u00f3n temporal. Las ventajas incluyen:<\/p>\n<ul>\n<li>Consistencia en el an\u00e1lisis de modelos con m\u00e1s de una tabla de hechos.<\/li>\n<li>Multitud de atributos bajo los que segmentar y filtrar los datos.<\/li>\n<li>Capacidad de utilizar las funciones de inteligencia de tiempo que nos ofrece el lenguaje DAX.<\/li>\n<\/ul>\n<p>Dicho esto, en este art\u00edculo vamos a crear una dimensi\u00f3n temporal paso a paso con <strong><em>Power Query Formula Language<\/em><\/strong> o simplemente \u201c<strong>M<\/strong>\u201d para los amigos. \u00a1All\u00e1 vamos!<\/p>\n<h4>Funci\u00f3n que crear\u00e1 la consulta<\/h4>\n<p>En primer lugar, crearemos una <strong>funci\u00f3n<\/strong> que ejecute la consulta en vez de crear la consulta directamente. Esto nos proporcionar\u00e1 la capacidad de reutilizar la misma funci\u00f3n en multitud de modelos de datos con distintas caracter\u00edsticas, ya que podremos introducir una serie de par\u00e1metros clave que pasaremos a la funci\u00f3n antes de que sea ejecutada.<\/p>\n<p>Estos 3 par\u00e1metros de los que hablamos son:<\/p>\n<ul>\n<li>la fecha en la que se iniciar\u00e1 nuestro calendario (<strong>FechaInicial<\/strong>)<\/li>\n<li>la fecha en la que terminar\u00e1 (<strong>FechaFinal<\/strong>)<\/li>\n<li>la configuraci\u00f3n regional sobre la que queremos que se eval\u00faen ciertos campos como los nombres del mes (<strong>Cultura<\/strong>). Sobre este \u00faltimo par\u00e1metro hablaremos al final del art\u00edculo a la hora de llamar a nuestra funci\u00f3n.<\/li>\n<\/ul>\n<p>El c\u00f3digo para la funci\u00f3n es:<\/p>\n<pre>let CrearCalendario = (\n    FechaInicial as date,\n    FechaFinal as date, \n    optional Cultura as nullable text as table\n  ) =&gt; in CrearCalendario<\/pre>\n<p>Todos los pasos que vamos a ir dando para crear nuestra consulta ir\u00e1n dentro del c\u00f3digo anterior, tanto el bloque <code>let<\/code> (donde definiremos las variables), como el <code>in<\/code> (donde especificaremos el <em>output<\/em> o resultado de la consulta).<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-77 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?resize=629%2C157&#038;ssl=1\" alt=\"Funci\u00f3n crear calendario\" width=\"629\" height=\"157\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?w=1039&amp;ssl=1 1039w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?resize=300%2C75&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?resize=768%2C192&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?resize=1024%2C256&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?resize=900%2C225&amp;ssl=1 900w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<h4>Base de la consulta<\/h4>\n<p>El primer paso es contar los d\u00edas que hay entre nuestras fechas inicial y final, esto calcular\u00e1 el n\u00famero de registros de nuestra tabla:<\/p>\n<pre>let\n  NumeroDias = Duration.Days(Duration.From(FechaFinal - FechaInicial)) + 1,<\/pre>\n<p>Seguidamente, utilizaremos la funci\u00f3n <code>List.Dates()<\/code> para generar una lista continua con todos los d\u00edas que existen entre nuestras dos fechas. La sintaxis de <code>List.Dates()<\/code> es:<\/p>\n<pre>List.Dates(&lt;Fecha inicial&gt;,&lt;n\u00ba de valores&gt;,&lt;incremento&gt;)<\/pre>\n<p>En nuestro ejemplo, la fecha inicial la tenemos definida en los par\u00e1metros de la funci\u00f3n que invocaremos para crear nuestra consulta y el n\u00famero de valores a devolver por <code>List.Dates()<\/code> lo hemos definido en las variables de la propia consulta justo en el paso anterior. La duraci\u00f3n ser\u00e1 <code>#duration(1,0,0,0)<\/code> con lo que especificamos que el incremento para cada registro sea de 1 d\u00eda. Los otros par\u00e1metros del tipo de dato duraci\u00f3n son hora, minuto y segundo. Por lo tanto, el c\u00f3digo para generar nuestro objeto de lista ser\u00e1:<\/p>\n<pre>Origen = List.Dates(FechaInicial,NumeroDias,#duration(1,0,0,0)),<\/pre>\n<p>El resultado de nuestra consulta hasta el momento es una lista de fechas, pero como nosotros necesitamos a\u00f1adir m\u00e1s columnas vamos a transformar la lista en una tabla. Este proceso se puede realizar con el editor de consultas de <em>Power BI<\/em>:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-2-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-78 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-2-1.png?resize=629%2C466&#038;ssl=1\" alt=\"Funci\u00f3n List.Dates()\" width=\"629\" height=\"466\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-2-1.png?w=759&amp;ssl=1 759w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-2-1.png?resize=300%2C222&amp;ssl=1 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>O, simplemente, a\u00f1adiendo el siguiente c\u00f3digo a nuestra consulta en el editor avanzado:<\/p>\n<pre>TablaDesdeLista = Table.FromList(Origen, Splitter.SplitByNothing()),<\/pre>\n<p>Una vez tenemos nuestra tabla, cambiamos el tipo de dato de la columna a tipo Fecha y renombramos el campo. Yo lo llamar\u00e9 simplemente Fecha.<\/p>\n<h4>Columnas adicionales<\/h4>\n<p>Ahora es cuesti\u00f3n de ir a\u00f1adiendo las columnas que nos ofrecer\u00e1n la posibilidad de filtrar y segmentar los datos de nuestro modelo. La mayor\u00eda de ellas podemos incorporarlas a nuestra tabla con el <strong>editor de consultas<\/strong> de la siguiente manera:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-79 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?resize=629%2C308&#038;ssl=1\" alt=\"A\u00f1adir campo a\u00f1o\" width=\"629\" height=\"308\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?w=1030&amp;ssl=1 1030w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?resize=300%2C147&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?resize=768%2C376&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?resize=1024%2C501&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-3-1.png?resize=900%2C440&amp;ssl=1 900w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Este paso a\u00f1ade una columna con el a\u00f1o de cada fecha a nuestra consulta y nos genera el siguiente paso:<\/p>\n<pre>A\u00f1oInsertado = Table.AddColumn(ColumnasConNombreCambiado, \"A\u00f1o\", each Date.Year([Fecha])),<\/pre>\n<p>Podemos entonces a\u00f1adir las columnas que formar\u00e1n parte de nuestra dimensi\u00f3n temporal y que usaremos tanto para filtrar y segmentar datos directamente como para usar en forma de par\u00e1metros en la creaci\u00f3n de nuestras medidas con el lenguaje DAX. Algunos campos se utilizar\u00e1n principalmente para ordenar otras columnas. Por ejemplo, para que el campo \u201cMes\u201d se muestre ordenado cronol\u00f3gicamente en las visualizaciones tenemos previamente que ordenarlo por el campo \u201cMesNumero\u201d desde la vista de datos, como se muestra en la siguiente imagen:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-4-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-80 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-4-1.png?resize=629%2C514&#038;ssl=1\" alt=\"Ordenar por columna\" width=\"629\" height=\"514\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-4-1.png?w=801&amp;ssl=1 801w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-4-1.png?resize=300%2C245&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-4-1.png?resize=768%2C628&amp;ssl=1 768w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>El c\u00f3digo para a\u00f1adir el resto de columnas de nuestra dimensi\u00f3n temporal es:<\/p>\n<pre> A\u00f1oInsertado = Table.AddColumn(ColumnasConNombreCambiado, \"A\u00f1o\", each Date.Year([Fecha])),\n TrimestreInsertado = Table.AddColumn(A\u00f1oInsertado, \"TrimestreNumero\", each Date.QuarterOfYear([Fecha]), Int64.Type),\n MesInsertado = Table.AddColumn(TrimestreInsertado, \"MesNumero\", each Date.Month([Fecha]), Int64.Type),\n DiaInsertado = Table.AddColumn(MesInsertado, \"DiaDelMes\", each Date.Day([Fecha]), Int64.Type),\n FechaIntInsertado = Table.AddColumn(DiaInsertado, \"FechaInt\", each [A\u00f1o] * 10000 + [MesNumero] * 100 + [DiaDelMes]),\n NombreMesInsertado = Table.AddColumn(FechaIntInsertado, \"Mes\", each Date.ToText([Fecha], \"MMMM\", Cultura), type text),\n MesEnCalendarioInsertado = Table.AddColumn(NombreMesInsertado, \"MesDelA\u00f1o\", each (try(Text.Range([Mes],0,3)) otherwise [Mes]) &amp; \" \" &amp; Number.ToText([A\u00f1o]),type text),\n TrimestreEnCalendarioInsertado = Table.AddColumn(MesEnCalendarioInsertado, \"TrimestreDelA\u00f1o\", each \"T\" &amp; Number.ToText([TrimestreNumero]) &amp; \" \" &amp; Number.ToText([A\u00f1o]),type text),\n DiaEnSemanaInsertado = Table.AddColumn(TrimestreEnCalendarioInsertado, \"DiaEnSemana\", each Date.DayOfWeek([Fecha])+1),\n NombreDiaInsertado = Table.AddColumn(DiaEnSemanaInsertado, \"Dia\", each Date.ToText([Fecha], \"dddd\", Cultura), type text),\n InicioSemanaInsertado = Table.AddColumn(NombreDiaInsertado, \"InicioSemana\", each Date.StartOfWeek([Fecha]), type date),\n FinalSemanaInsertado = Table.AddColumn(InicioSemanaInsertado, \"FinalSemana\", each Date.EndOfWeek([Fecha]), type date),\n SemanaDelA\u00f1oInsertado = Table.AddColumn(FinalSemanaInsertado, \"Semana\", each \"Semana \" &amp; Number.ToText(Date.WeekOfYear([Fecha])), type text),\n FinDeSemanaInsertado = Table.AddColumn(SemanaDelA\u00f1oInsertado, \"FinDeSemana\", each if [DiaEnSemana] = 6 or [DiaEnSemana] = 7 then \"Fin de semana\" else \"Entre semana\" ),<\/pre>\n<p>La mayor\u00eda de los campos anteriores pueden crearse con el editor de consultas como comentamos anteriormente. Para algunas de ellas como FechaInt o MesDelA\u00f1o tendremos que escribir el c\u00f3digo manualmente. Menci\u00f3n especial merece la f\u00f3rmula de \u201cDiaEnSemana\u201d, \u00bfpor qu\u00e9 le sumamos 1 al resultado de la funci\u00f3n <code>Date.DayOfWeek()<\/code>? la respuesta es que en el lenguaje M, dicha funci\u00f3n nos devuelve los valores desde un vector con base de indexaci\u00f3n 0. Esto es inconsistente con c\u00f3mo estamos acostumbrados los que hemos trabajado con Excel, ya que la funci\u00f3n <code>DIASEM()<\/code> devuelve los valores desde un vector con base 1. Lo mismo ocurre con la funci\u00f3n <code>WEEKDAY()<\/code> de DAX. Haciendo esta modificaci\u00f3n obtendremos el valor 1 para el lunes y el 7 para el domingo en nuestra consulta.<\/p>\n<p>Es muy com\u00fan tambi\u00e9n la necesidad en muchos negocios de analizar alg\u00fan valor agregado para el d\u00eda de hoy o para el mes actual. Por lo que yo suelo a\u00f1adir estas dos columnas tambi\u00e9n:<\/p>\n<pre>EsHoy = Table.AddColumn(FinDeSemanaInsertado, \"EsHoy\", each Date.IsInCurrentDay([Fecha])),\nEsMesActual = Table.AddColumn(EsHoy, \"EsMesActual\", each Date.IsInCurrentMonth([Fecha])),<\/pre>\n<p>El lenguaje M tiene muchas m\u00e1s funciones de este tipo que usan la fecha y la hora del sistema y nos devuelven un valor l\u00f3gico, como <code>Date.IsInPreviousWeek()<\/code> y <code>Date.IsInCurrentYear()<\/code> que pueden ser tambi\u00e9n muy interesantes como parte de la dimensi\u00f3n temporal en muchos negocios. En algunas ocasiones estas funciones pueden tambi\u00e9n ahorrarnos algo de c\u00f3digo a la hora de trabajar con las funciones de inteligencia de tiempo de DAX.<\/p>\n<h4>El c\u00f3digo completo y c\u00f3mo utilizarlo<\/h4>\n<p>Para crear directamente la dimensi\u00f3n temporal a partir del c\u00f3digo, simplemente desde la pesta\u00f1a inicio del editor de consultas seleccionamos Nuevo Origen -&gt; Consulta en blanco:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-5-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-81 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-5-1.png?resize=498%2C605&#038;ssl=1\" alt=\"Origen consulta en blanco\" width=\"498\" height=\"605\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-5-1.png?w=498&amp;ssl=1 498w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-5-1.png?resize=247%2C300&amp;ssl=1 247w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/a><\/p>\n<p>Y, posteriormente, con la nueva consulta seleccionada abrimos el editor avanzado, reemplazamos el c\u00f3digo por defecto por el c\u00f3digo completo de nuestra funci\u00f3n, que podemos encontrar al final del art\u00edculo y pinchamos Listo:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-322 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?resize=629%2C482&#038;ssl=1\" alt=\"\" width=\"629\" height=\"482\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?w=1152&amp;ssl=1 1152w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?resize=300%2C230&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?resize=768%2C589&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?resize=1024%2C785&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/12\/imagen-61-1.png?resize=900%2C690&amp;ssl=1 900w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>El editor de consultas nos muestra ahora la definici\u00f3n de la funci\u00f3n y un di\u00e1logo para que introduzcamos los par\u00e1metros necesarios.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-7-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-83 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-7-1.png?resize=629%2C466&#038;ssl=1\" alt=\"Introducir par\u00e1metros\" width=\"629\" height=\"466\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-7-1.png?w=801&amp;ssl=1 801w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-7-1.png?resize=300%2C222&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-7-1.png?resize=768%2C569&amp;ssl=1 768w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Introducimos las fechas de inicio y final de nuestro calendario y en Cultura podemos introducir es-ES para seleccionar el idioma espa\u00f1ol. Este \u00faltimo par\u00e1metro es opcional y si lo dejamos en blanco se utilizar\u00e1 la configuraci\u00f3n regional del ingl\u00e9s de EEUU. La informaci\u00f3n relativa a las configuraciones culturales disponibles puede obtenerse en esta <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/cc233982.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color: #3366ff;\">documentaci\u00f3n de MSDN<\/span><\/a>.<\/p>\n<p>Finalmente pinchamos en invocar y tendremos la consulta generada al instante. \u00a1Todo hecho!<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-84 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=629%2C291&#038;ssl=1\" alt=\"Consulta generada\" width=\"629\" height=\"291\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?w=1897&amp;ssl=1 1897w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=300%2C139&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=768%2C355&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=1024%2C473&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=900%2C416&amp;ssl=1 900w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-8-1.png?resize=1280%2C592&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<h6>C\u00f3digo completo<\/h6>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-126 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=629%2C186&#038;ssl=1\" alt=\"C\u00f3digo Notepad++\" width=\"629\" height=\"186\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?w=1525&amp;ssl=1 1525w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=300%2C89&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=768%2C227&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=1024%2C302&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=900%2C266&amp;ssl=1 900w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/captura-1.png?resize=1280%2C378&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<pre>let CrearCalendario = (FechaInicial as date, FechaFinal as date, optional Cultura as nullable text) as table =&gt;\n   let\n   NumeroDias = Duration.Days(Duration.From(FechaFinal - FechaInicial))+1,\n   Origen = List.Dates(FechaInicial,NumeroDias,#duration(1,0,0,0)),\n   TablaDesdeLista = Table.FromList(Origen, Splitter.SplitByNothing()),\n   TipoCambiado = Table.TransformColumnTypes(TablaDesdeLista,{{\"Column1\", type date}}),\n   ColumnasConNombreCambiado = Table.RenameColumns(TipoCambiado,{{\"Column1\", \"Fecha\"}}),\n   A\u00f1oInsertado = Table.AddColumn(ColumnasConNombreCambiado, \"A\u00f1o\", each Date.Year([Fecha])),\n   TrimestreInsertado = Table.AddColumn(A\u00f1oInsertado, \"TrimestreNumero\", each Date.QuarterOfYear([Fecha]), Int64.Type),\n   MesInsertado = Table.AddColumn(TrimestreInsertado, \"MesNumero\", each Date.Month([Fecha]), Int64.Type),\n   DiaInsertado = Table.AddColumn(MesInsertado, \"DiaDelMes\", each Date.Day([Fecha]), Int64.Type),\n   FechaIntInsertado = Table.AddColumn(DiaInsertado, \"FechaInt\", each [A\u00f1o] * 10000 + [MesNumero] * 100 + [DiaDelMes]),\n   NombreMesInsertado = Table.AddColumn(FechaIntInsertado, \"Mes\", each Date.ToText([Fecha], \"MMMM\", Cultura), type text),\n   MesEnCalendarioInsertado = Table.AddColumn(NombreMesInsertado, \"MesDelA\u00f1o\", each (try(Text.Range([Mes],0,3)) otherwise [Mes]) &amp; \" \" &amp; Number.ToText([A\u00f1o]),type text),\n   TrimestreEnCalendarioInsertado = Table.AddColumn(MesEnCalendarioInsertado, \"TrimestreDelA\u00f1o\", each \"T\" &amp; Number.ToText([TrimestreNumero]) &amp; \" \" &amp; Number.ToText([A\u00f1o]),type text),\n   DiaEnSemanaInsertado = Table.AddColumn(TrimestreEnCalendarioInsertado, \"DiaEnSemana\", each Date.DayOfWeek([Fecha])+1),\n   NombreDiaInsertado = Table.AddColumn(DiaEnSemanaInsertado, \"Dia\", each Date.ToText([Fecha], \"dddd\", Cultura), type text),\n   InicioSemanaInsertado = Table.AddColumn(NombreDiaInsertado, \"InicioSemana\", each Date.StartOfWeek([Fecha]), type date),\n   FinalSemanaInsertado = Table.AddColumn(InicioSemanaInsertado, \"FinalSemana\", each Date.EndOfWeek([Fecha]), type date),\n   SemanaDelA\u00f1oInsertado = Table.AddColumn(FinalSemanaInsertado, \"Semana\", each \"Semana \" &amp; Number.ToText(Date.WeekOfYear([Fecha])), type text),\n   FinDeSemanaInsertado = Table.AddColumn(SemanaDelA\u00f1oInsertado, \"FinDeSemana\", each if [DiaEnSemana] = 6 or [DiaEnSemana] = 7 then \"Fin de semana\" else \"Entre semana\" ),\n   EsHoy = Table.AddColumn(FinDeSemanaInsertado, \"EsHoy\", each Date.IsInCurrentDay([Fecha])),\n   EsMesActual = Table.AddColumn(EsHoy, \"EsMesActual\", each Date.IsInCurrentMonth([Fecha])),\n   PrimeraEnMayusculas = Table.TransformColumns(EsMesActual,{{\"Mes\", Text.Proper, type text}, {\"MesDelA\u00f1o\", Text.Proper, type text}, {\"Dia\", Text.Proper, type text}})\n   in\n   PrimeraEnMayusculas\nin\n CrearCalendario<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2,6],"tags":[10,29,11,12,14,18],"post_series":[],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-arquitectura-de-datos","category-m-power-query","tag-editor-de-consultas","tag-etl","tag-inteligencia-de-negocios","tag-m","tag-power-bi","tag-power-query"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Admin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Dimensi\u00f3n temporal en M | Business Intelligence Controlling\" \/>\n\t\t<meta property=\"og:description\" content=\"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2017-11-04T15:52:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-07-16T12:51:59+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Dimensi\u00f3n temporal en M | Business Intelligence Controlling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#article\",\"name\":\"Dimensi\\u00f3n temporal en M | Business Intelligence Controlling\",\"headline\":\"Dimensi\\u00f3n temporal en M\",\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/bicontrolling.com\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/imagen-1-1.png?fit=1039%2C260&ssl=1\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#articleImage\",\"width\":1039,\"height\":260,\"caption\":\"Funci\\u00f3n crear calendario\"},\"datePublished\":\"2017-11-04T15:52:37+01:00\",\"dateModified\":\"2019-07-16T14:51:59+02:00\",\"inLanguage\":\"es-ES\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#webpage\"},\"articleSection\":\"Arquitectura de datos, M (Power Query), Editor de consultas, ETL, Inteligencia de negocios, M, Power BI, Power Query\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/bicontrolling.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"position\":2,\"name\":\"Arquitectura de datos\",\"item\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#listItem\",\"name\":\"Dimensi\\u00f3n temporal en M\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#listItem\",\"position\":3,\"name\":\"Dimensi\\u00f3n temporal en M\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/\",\"name\":\"Admin\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#webpage\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/\",\"name\":\"Dimensi\\u00f3n temporal en M | Business Intelligence Controlling\",\"description\":\"Una de las dimensiones cr\\u00edticas a la hora de crear un modelo de datos anal\\u00edtico es, sin duda, la dimensi\\u00f3n temporal. En los \\u00faltimos a\\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\\u00eda temporal autom\\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2017\\\/11\\\/04\\\/dimension-temporal-en-m\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2017-11-04T15:52:37+01:00\",\"dateModified\":\"2019-07-16T14:51:59+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Dimensi\u00f3n temporal en M | Business Intelligence Controlling","description":"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo","canonical_url":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#article","name":"Dimensi\u00f3n temporal en M | Business Intelligence Controlling","headline":"Dimensi\u00f3n temporal en M","author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2017\/11\/imagen-1-1.png?fit=1039%2C260&ssl=1","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#articleImage","width":1039,"height":260,"caption":"Funci\u00f3n crear calendario"},"datePublished":"2017-11-04T15:52:37+01:00","dateModified":"2019-07-16T14:51:59+02:00","inLanguage":"es-ES","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#webpage"},"isPartOf":{"@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#webpage"},"articleSection":"Arquitectura de datos, M (Power Query), Editor de consultas, ETL, Inteligencia de negocios, M, Power BI, Power Query"},{"@type":"BreadcrumbList","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","position":1,"name":"Inicio","item":"https:\/\/bicontrolling.com","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","position":2,"name":"Arquitectura de datos","item":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#listItem","name":"Dimensi\u00f3n temporal en M"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#listItem","position":3,"name":"Dimensi\u00f3n temporal en M","previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}}]},{"@type":"Organization","@id":"https:\/\/bicontrolling.com\/#organization","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","url":"https:\/\/bicontrolling.com\/"},{"@type":"Person","@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author","url":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/","name":"Admin"},{"@type":"WebPage","@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#webpage","url":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/","name":"Dimensi\u00f3n temporal en M | Business Intelligence Controlling","description":"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/bicontrolling.com\/#website"},"breadcrumb":{"@id":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/#breadcrumblist"},"author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"creator":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"datePublished":"2017-11-04T15:52:37+01:00","dateModified":"2019-07-16T14:51:59+02:00"},{"@type":"WebSite","@id":"https:\/\/bicontrolling.com\/#website","url":"https:\/\/bicontrolling.com\/","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","inLanguage":"es-ES","publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","og:type":"article","og:title":"Dimensi\u00f3n temporal en M | Business Intelligence Controlling","og:description":"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo","og:url":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/","article:published_time":"2017-11-04T15:52:37+00:00","article:modified_time":"2019-07-16T12:51:59+00:00","twitter:card":"summary","twitter:title":"Dimensi\u00f3n temporal en M | Business Intelligence Controlling","twitter:description":"Una de las dimensiones cr\u00edticas a la hora de crear un modelo de datos anal\u00edtico es, sin duda, la dimensi\u00f3n temporal. En los \u00faltimos a\u00f1os, las herramientas de inteligencia de negocios suelen incluir una jerarqu\u00eda temporal autom\u00e1tica que se crea a partir de los campos de fecha presentes en el modelo"},"aioseo_meta_data":{"post_id":"64","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-31 11:39:56","updated":"2025-06-04 11:10:56","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/\" title=\"Arquitectura de datos\">Arquitectura de datos<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tDimensi\u00f3n temporal en M\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/bicontrolling.com"},{"label":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},{"label":"Dimensi\u00f3n temporal en M","link":"https:\/\/bicontrolling.com\/index.php\/2017\/11\/04\/dimension-temporal-en-m\/"}],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2059,"url":"https:\/\/bicontrolling.com\/index.php\/2023\/08\/31\/integridad-referencial-y-miembros-de\/","url_meta":{"origin":64,"position":0},"title":"Integridad referencial y miembros desconocidos en Power BI","author":"Admin","date":"31 agosto, 2023","format":false,"excerpt":"Introducci\u00f3n En este art\u00edculo vamos a explorar como se comporta Power BI cuando en un modelo de datos existen violaciones de la integridad referencial, y como podemos identificar y solventar este problema, a la vez que agrupamos los miembros desconocidos dot\u00e1ndolos de significado y garantizando la integridad de nuestro modelo.\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-1.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":356,"url":"https:\/\/bicontrolling.com\/index.php\/2019\/02\/18\/dimension-horaria-en-m\/","url_meta":{"origin":64,"position":1},"title":"Dimensi\u00f3n horaria en M","author":"Admin","date":"18 febrero, 2019","format":false,"excerpt":"En casi cualquier modelo de datos que dise\u00f1emos ser\u00e1 imprescindible disponer de una dimensi\u00f3n temporal que nos permita filtrar y segmentar los valores num\u00e9ricos de las tablas de hechos en funci\u00f3n de los atributos temporales que nos interesen en cada momento. La dimensi\u00f3n temporal m\u00e1s com\u00fan y \u00fatil corresponde a\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-5-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-5-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-5-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/08\/image-5-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1769,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/12\/09\/crear-dimension-horaria-en-dax\/","url_meta":{"origin":64,"position":2},"title":"Crear dimensi\u00f3n horaria en DAX","author":"Admin","date":"9 diciembre, 2020","format":false,"excerpt":"Introducci\u00f3n En una entrada anterior vimos c\u00f3mo, en escenarios donde tanto los atributos relacionados con la fecha como los relacionados con la hora son relevantes para el an\u00e1lisis que queremos realizar, pod\u00edamos crear una dimensi\u00f3n horaria en M que nos sirviera para filtrar y segmentar nuestras medidas en funci\u00f3n de\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/12\/Imagen-34.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":267,"url":"https:\/\/bicontrolling.com\/index.php\/2018\/01\/28\/dias-festivos-nacionales-en-dimension-temporal\/","url_meta":{"origin":64,"position":3},"title":"D\u00edas festivos nacionales en dimensi\u00f3n temporal","author":"Admin","date":"28 enero, 2018","format":false,"excerpt":"Aquellos profesionales que trabajan en temas relacionados con la gesti\u00f3n anal\u00edtica de los datos de una empresa, conocen que existen multitud de an\u00e1lisis interesantes que dependen \u00edntegramente de la dimensi\u00f3n temporal del modelo de datos. Sin una dimensi\u00f3n temporal cuyos metadatos se adapten a las caracter\u00edsticas de la empresa en\u2026","rel":"","context":"En \u00abM (Power Query)\u00bb","block_context":{"text":"M (Power Query)","link":"https:\/\/bicontrolling.com\/index.php\/category\/m-power-query\/"},"img":{"alt_text":"Imagen 1","src":"https:\/\/trainingpowerbi.files.wordpress.com\/2017\/12\/imagen-1.png?w=350&h=200&crop=1","width":350,"height":200},"classes":[]},{"id":430,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/02\/20\/desnormalizando-consultas-de-forma-eficiente-2\/","url_meta":{"origin":64,"position":4},"title":"Desnormalizando dimensiones de forma eficiente","author":"Admin","date":"20 febrero, 2020","format":false,"excerpt":"Como vimos en una entrada anterior, cuando dise\u00f1amos un modelo de datos anal\u00edtico, el enfoque principal debe situarse en lograr un dise\u00f1o que favorezca la simplicidad en la exploraci\u00f3n y agregaci\u00f3n de los datos, a la vez que en obtener un rendimiento \u00f3ptimo en la realizaci\u00f3n de consultas. Las estructuras\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/09\/image-31-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1938,"url":"https:\/\/bicontrolling.com\/index.php\/2021\/11\/26\/hasta-el-ultimo-segundo-en-power-bi\/","url_meta":{"origin":64,"position":5},"title":"Hasta el \u00faltimo segundo en Power BI","author":"Admin","date":"26 noviembre, 2021","format":false,"excerpt":"Video de mi participaci\u00f3n en Power Platform Madrid, con una sesi\u00f3n sobre la creaci\u00f3n y el uso de una dimensi\u00f3n horaria que nos permita analizar nuestros hechos a granularidades inferiores al d\u00eda. https:\/\/www.youtube.com\/watch?v=UViZ3lzLxrE","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/UViZ3lzLxrE\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":2,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":1249,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions\/1249"}],"wp:attachment":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/media?parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/categories?post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/tags?post=64"},{"taxonomy":"post_series","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/post_series?post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}