en-USsv-SE

Active Forums

PrevPrev Go to previous topic
NextNext Go to next topic
Last Post 30 Dec 2016 05:00 PM by  Nitz
Konvertera heltal till datum
 5 Replies
Sort:
You are not authorized to post a reply.
Author Messages
Pelle Bergkvist
New Member
New Member
Posts: 2


--
19 Dec 2016 07:31 PM
    Hej
    Med risk för att få dumstrut på huvudet, men jag måste höra med er som kan något.

    Vi har datum som heltal i vårt data warehouse och emellanåt vill jag gruppera enbart på år och månad för vidare bearbetning i Excel. Det går såklart att casta till nchar och plocka ner datumet i år och månad med '-' som separator, det brukar Excel fatta.

    En annan metod är att konvertera till datum, men det måste finna fiffigare metoder än exempelvis (ger visserligen önskat resultat):

    DECLARE @date int;
    SET @date = 20161219

    SELECT CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, CAST(LEFT(@Date, 8) AS DATE)), 0) AS DATE);

    Om man kör:
    DECLARE @date int;
    SET @date = 20161219

    SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, CAST(LEFT(@Date, 8) AS DATE)), 0);

    Får man 2016-12-01 00:00:00.000 (vilket jag inte vill ha)

    Hur som helst, problemet är löst, men jag efterlyser en elegantare lösning
    Karfunkel
    New Member
    New Member
    Posts: 11


    --
    20 Dec 2016 03:40 PM
    declare @a int = 20161220
    declare @b date = cast(cast(@a as nvarchar(8)) as date)
    Pelle Bergkvist
    New Member
    New Member
    Posts: 2


    --
    20 Dec 2016 07:29 PM
    Hej
    Njae, den konverterar heltalet till ett datum. Jag är ute efter att konvertera till ett datum, där dagen hela tiden är 01.

    Exempel:
    20161220 skall bli 2016-12-01

    Karfunkel
    New Member
    New Member
    Posts: 11


    --
    21 Dec 2016 02:36 PM
    Aha, jag missförstod. Vet inte om detta tillför någon elegans alls. Borde finnas en BOMONTH.

    declare @a int = 20161220
    declare @b date = DATEADD(DAY, 1, EOMONTH(cast(cast(@a as nvarchar(8)) as date), -1))
    Nitz
    New Member
    New Member
    Posts: 3


    --
    30 Dec 2016 04:50 PM
    Hej!

    Är osäker på om du vill ha med streck eller inte i ditt datum men om du ville ha utan kan du prova:

    DECLARE
    @date int;

    SELECT
    @date = 20161230;

    SELECT
    (@date / 100) * 100 + 1 AS FirstOfMonth;

    Detta skiftar bort en- och tiotal från din int (Edit (förtydligande): Och lägger till 1 igen för månadens första dag).

    En bättre variant skulle kunna vara att generera och spara undan Year och FirstDayOfMonth i din date-dimension så har du alltid möjlighet att gruppera på detta i ditt Data Warehouse.

    Om du vill ha med streck så har du fått svar av Karfunkel redan.

    God fortsättning!
    /N
    Nitz
    New Member
    New Member
    Posts: 3


    --
    30 Dec 2016 05:00 PM
    Slänger även in denna variant om du vill ha med streck:

    DECLARE
    @date int;

    SELECT
    @date = 20161230;

    SELECT
    CONVERT(DATE, (CAST(((@date / 100) * 100 + 1) AS VARCHAR(8)))) AS FirstOfMonth;

    Kör convert på date så du har möjlighet att välja format om så önskas längre fram.
    You are not authorized to post a reply.