sql >> Database teknologi >  >> RDS >> Sqlserver

Konvertering af JDE juliansk dato til gregoriansk

Jeg tror, ​​det er mere effektivt at bruge indbygget datetime-matematik end al denne skift frem og tilbage til forskellige streng-, dato- og numeriske formater.

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));

Resultat:

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

Forudsat at disse data ikke ændres ofte, kan det være meget mere effektivt faktisk at gemme datoen som en beregnet kolonne (hvilket er grunden til, at jeg valgte basisdatoen 0 i stedet for en strengrepræsentation, hvilket ville forårsage determinismeproblemer, der forhindrer kolonnen i at blive ved med og potentielt indekseres).

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;

Resultater:

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

Selvom du ikke indekserer kolonnen, skjuler den stadig den grimme beregning væk fra dig, idet du fortsat betaler det på skrivetidspunktet, da det ikke får dig til at udføre dyre funktionelle operationer på forespørgselstidspunktet, når der refereres til den kolonne. ...



  1. SQL Server Login fejl:Login mislykkedes for brugeren 'NT AUTHORITY\SYSTEM'

  2. CS50:LIKE operator, variabel substitution med % udvidelse

  3. Oracle SQL :Henter ikke-eksisterende værdier fra IN-sætning

  4. MySQL konverterer grader, minutter, sekunder til grader decimaler