sql >> Databáze >  >> RDS >> Sqlserver

Převod JDE juliánského data na gregoriánské

Myslím, že je efektivnější používat nativní matematiku data a času, než celé to přepínání tam a zpět na různé formáty řetězců, data a čísel.

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

Výsledek:

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

Za předpokladu, že se tato data často nemění, může být mnohem efektivnější uložit datum jako vypočítaný sloupec (proto jsem zvolil základní datum 0 místo nějaké řetězcové reprezentace, která by způsobila problémy s determinismem bránící tomu, aby byl sloupec zachován a potenciálně indexován).

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;

Výsledky:

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

I když sloupec neindexujete, stále před vámi skrývá ošklivý výpočet, protože při zachování platíte pouze v době zápisu, protože to nezpůsobuje provádění drahých funkčních operací v době dotazu, kdykoli je na sloupec odkazováno. ...



  1. Mohou existovat dva vztahy mezi dvěma tabulkami?

  2. Požadavky na obnovu před zálohováním

  3. Jak vrátit ukázkový řádek z databáze jeden po druhém

  4. Převeďte časové razítko na datum v dotazu MySQL