Datum i variabler

När man arbetar med datum i variabler i scriptet i QlikView och Sense är det lätt att det blir fel. I det här blogginlägget ska vi titta på bra tekniker och en del kluriga fallgropar.



Datum i QlikView och Sense är av typen dual - ett fält som har både ett numeriskt och ett alfanumeriskt värde. För användaren visas det alfanumeriska värdet (t.ex. 2021-10-22), men i bakgrunden finns också det numeriska värdet som motsvarar antalet dagar sedan 1899-12-30. För 2021-10-22 är det numeriska värdet 44491.


En variabel kan dock inte lagra två värden samtidigt och endast ett av värde kommer att sparas. Beroende på fallet kan vi behöva välja om det numeriska eller alfanumeriska värdet ska vara sparat.


Let vToday = today();


Ovanstående rad lagrar det alfanumeriska värdet "2021-10-22" i variabeln vToday. Det går bra så länge vi också avser att använda värdet på rätt sätt. Exempelvis kan vi skriva koden:


Load * from StockHistory_$(vToday).qvd (qvd);


Vid exekvering kommer variabeln vToday's värde ersätta $(vToday) och from-raden i kodsnutten ovan översätts till: from StockHistory_2021-10-22.qvd (qvd).


Om vi däremot använder variabeln i kod på följande sätt kommer vi få problem:


Load * from Stock.qvd (qvd) where LastReceiptDate >= $(vToday);


Avsikten är att läsa ut rader från filen Stock.qvd där fältet LastReceiptDate har ett värde större än eller lika med 2021-10-22, men när variabelns värde ersätter $(vToday) får man följande kod: Load * from Stock.qvd (qvd) where LastReceiptDate >= 2021-10-22;


I detta fall kommer 2021-10-22 motsvara ett uttryck som beräknas till "2021 minus 10 minus 22" = 1989. Sedan kommer 1989 användas som numeriskt värde i jämförelsen med LastReceiptDate. 1989 motsvarar ett datum 1989 dagar efter 1899-12-30, vilket är 1905-06-11. Med stor sannolikhet får vi ut samtliga lagerrader från Stock.qvd då alla transaktioner troligen skett efter år 1905.


För att korrigera koden ovan behöver vi antingen lagra ett numeriskt värde för datumet eller använda en funktion som omvandlar texten 2021-10-22 till ett datum. För att spara ett numeriskt värde använder vi:


Let vToday = num(today());


Detta ger istället koden Load * from Stock.qvd (qvd) where LastReceiptDate >= 44491. Detta kommer att fungera som jämförelse förutsatt att LastReceiptDate är ett datumfält i Qlik.


Alternativet med att använda en funktion i jämförelsen är: Load * from Stock.qvd (qvd) where LastReceiptDate >= date#('$(vToday)','YYYY-MM-DD'). Date#()-funktionen omvandlar en textsträng till ett datum innan jämförelsen. Observera enkel-citationstecknen som behövs för att inte värdet istället ska bli date#(1989,'YYYY-MM-DD') och detta kommer inte att fungera.


 

Skriven av: Morgan Kejerhag

Morgan Kejerhag har arbetat med beslutsstöd sedan 2005 och är en av Sveriges mest erfarna Qlik-konsulter. Under åren har Morgan arbetat med flertalet multinationella bolag där han lett arbetet i att bygga upp stora miljöer såväl som små kunder. LinkedIn Kontaktuppgifter