sql >> Database >  >> RDS >> Sqlserver

JDE Juliaanse datum converteren naar Gregoriaans

Ik denk dat het efficiënter is om native datetime-wiskunde te gebruiken dan al dat heen en weer schakelen naar verschillende tekenreeksen, datums en numerieke formaten.

DECLARE @julian VARCHAR(6) = '111186';

SELECT DATEADD(YEAR, 
  100*CONVERT(INT, LEFT(@julian,1))
  +10*CONVERT(INT, SUBSTRING(@julian, 2,1))
  +CONVERT(INT, SUBSTRING(@julian,3,1)), 
 DATEADD(DAY, CONVERT(INT,SUBSTRING(@julian, 4, 3))-1, 
 0));

Resultaat:

===================
2011-07-05 00:00:00

Ervan uitgaande dat deze gegevens niet vaak veranderen, kan het veel efficiënter zijn om de datum daadwerkelijk op te slaan als een berekende kolom (daarom heb ik de basisdatum van 0 gekozen in plaats van een tekenreeksrepresentatie, die determinismeproblemen zou veroorzaken, waardoor de kolom niet kan worden behouden en mogelijk kan worden geïndexeerd).

CREATE TABLE dbo.JDEDates
(
    JDEDate VARCHAR(6),

    GregorianDate AS CONVERT(SMALLDATETIME, 
      DATEADD(YEAR, 
        100*CONVERT(INT, LEFT(RIGHT('0'+JDEDate,6),1))
        +10*CONVERT(INT, SUBSTRING(RIGHT('0'+JDEDate,6), 2,1))
        +CONVERT(INT, SUBSTRING(RIGHT('0'+JDEDate,6),3,1)), 
      DATEADD(DAY, CONVERT(INT, RIGHT(JDEDate, 3))-1, 
      0))
    ) PERSISTED
);

INSERT dbo.JDEDates(JDEDate) SELECT '111186';

SELECT JDEDate, GregorianDate FROM dbo.JDEDates;

Resultaten:

JDEDate GregorianDate
======= ===================
111186  2011-07-05 00:00:00

Zelfs als u de kolom niet indexeert, verbergt het nog steeds de lelijke berekening voor u, omdat u volhardt, betaalt u dat alleen tijdens het schrijven, omdat het er niet voor zorgt dat u tijdens het opvragen dure functionele bewerkingen uitvoert wanneer naar die kolom wordt verwezen ...



  1. Hoe alleen datum en jaar te vergelijken in php codeigniter

  2. docker compose:spring boot-verbinding met mysql-database geweigerd

  3. JDBC CallableStatement en Oracle SYS_REFCURSOR IN parameters?

  4. Verschillende rijen filteren in SQL