Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуване на JDE юлианска дата в григорианска

Мисля, че е по-ефективно да се използва естествена математика за дата и час, отколкото цялото това превключване напред и назад към различни низови, датни и числови формати.

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

Резултат:

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

Ако приемем, че тези данни не се променят често, може да е много по-ефективно действително да съхраните датата като изчислена колона (поради което избрах базовата дата от 0 вместо някакво представяне на низ, което би причинило проблеми с детерминизма, предотвратявайки запазването и потенциалното индексиране на колоната).

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;

Резултати:

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

Дори и да не индексирате колоната, тя все още скрива грозното изчисление далеч от вас, като бъдете постоянни, вие плащате това само по време на запис, тъй като не ви кара да извършвате скъпи функционални операции по време на заявка, когато тази колона се препраща ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничение за регулярен израз на SQL Server

  2. Изтриване на дублиращи се редове в SQL Server

  3. Преобразуване на дата и култура:Разлика между DATE и DATETIME

  4. Как да комбинирате множество редове LineString в една колекция от редове

  5. Подобрете настройката на производителността на SQL Server с тези 3 съвета