What is the precise definition of JDE's Julian Date format?

后端 未结 8 638
清歌不尽
清歌不尽 2020-12-03 18:02

I am writing code to convert from a Gregorian date to a JDE (J.D.Edwards) Julian date.

Note: a JDE Julian date is different from the normal usag

相关标签:
8条回答
  • 2020-12-03 18:11

    The "JDE Julian Date Converter" does return a negative value for:

    1809/07/23 : -90635
    

    As opposed to the classical Julian Date:

    The Julian date for CE  1809 July 23 00:00:00.0 UT is
    JD 2381986.50000
    

    Here is a example of JD EDWARDS (AS/400 software) Julian Date, but that is not an "official" documentation and it does not seems to support dates before 1900...

    Note: this "ACC: How to Convert Julian Days to Dates in Access and Back" does not support date before 1900 either... as it speaks about an "informal" Julian day, commonly used by government agencies and contractors.

    The informal Julian day format used in this article is the ordinal day of a year (for example, Julian day 032 represents February 1st, or the 32nd day of the year).
    Variations on informal Julian day formats include using a preceding two-digit year (for example 96032 for 2/1/96) and separating the year with a dash (for example 96-032).
    Another, less popular, Julian day format uses a one digit year (for example 6-032). These additional formats do not uniquely identify the century or decade. You should carefully consider the consequences when using these formats; for example, the Julian day 00061 can be interpreted as 3/1/2000 or 3/2/1900.

    0 讨论(0)
  • 2020-12-03 18:14

    A sample of VBA code to convert back and forth between JDE Julian Date and Gregorian:

    Public Const Epoch = 1900
    Public Const JDateMultiplier = 1000
    Public Const FirstJan = "01/01/"
    
    Public Function Julian2Date(ByVal vDate As Long) As Date
    
        Dim Year As Long
        Dim Days As Long
        Dim SeedDate As Date
    
        '   Day Number
        Days = vDate - (Int(vDate / JDateMultiplier) * JDateMultiplier) - 1
        '   Calendar Year
        Year = ((vDate - Days) / JDateMultiplier) + Epoch
        '   First Day of Calendar Year
        SeedDate = CDate(FirstJan + CStr(Year))
    
        '   Add Number of Days to First Day in Calendar Year
        Julian2Date = DateAdd("d", Days, SeedDate)
    
    End Function
    
    Public Function Date2Julian(ByVal vDate As Date) As Long
    
        Dim JYear As String
        Dim BeginDate As Date
        Dim JDays As Long
    
        '   Calendar Year
        JYear = Format(Year(vDate), "0000")
        '   First Day of Calendar Year
        BeginDate = CDate(FirstJan + JYear)
        '   Day Number
        JDays = DateDiff("d", BeginDate, vDate) + 1
    
        '   Add Number of Days to Year Number
        Date2Julian = ((CLng(JYear) - Epoch) * JDateMultiplier) + JDays
    
    End Function
    

    I have tried to make it as clear and simple as possible, and to this end I have intentionally left out any error trapping. However, you should be able to add the code to a VBA module and call them directly from your own code.

    I also include some useful snippets of T-SQL:

    Todays Date as JDE Julian Date:

     (datepart(yy,getdate())-1900) * 1000 + datepart(dy, getdate())
    

    Convert JDE Julian Date to Gregorian (DD/MM/YYYY), replace XXXXXX with the column name containing the JDE Julian Date:

    convert (varchar, dateadd (day,convert (int, right(XXXXXX,3)) - 1, convert (datetime, ('1/1/' + convert ( varchar, (cast(left(right(XXXXXX+1000000,6),3) as varchar) + 1900))))),103)
    

    If you require a different Gregorian format, replace the 103 value (right at the end) with the applicable value found here: https://msdn.microsoft.com/en-us/library/ms187928.aspx

    0 讨论(0)
  • 2020-12-03 18:16

    The JDE Julian date consists of CYYDDD which is Century, Year, Day of year.

    Century is zero for 20th e.g. 19XX and one for 21st e.g. 20XX.

    The year is two digits. So 101001 is 1 January 2001

    As you can see this will not support dates before 1900.

    See this Oracle page for a simple and official explanation: About the Julian Date Format

    0 讨论(0)
  • 2020-12-03 18:21

    Maybe off from the question, you can convert in Excel using the following formula:

    Convert Julian to Date in Excel

    In Cell A2 place a Julian date, like 102324
    in Cell B2 place this formula: (copy it in)
    =DATE(YEAR("01/01/"&TEXT(1900+INT(A2/1000),0)),MONTH("01/01/"&TEXT(1900+INT(A2/1000),0)),DAY("01/01/"&TEXT(1900+INT(A2/1000),0)))+MOD(A2,1000)-1

    The date 11/20/02 date will appear in cell B2

    Convert Date to Julian in Excel

    In Cell C2 copy this formula:
    =(YEAR(B2)-2000+100)*1000+B2-DATE(YEAR(B2),"01","01")+1

    This will convert B2 back to 102324

    0 讨论(0)
  • 2020-12-03 18:25

    I have an easy way for C using time now and epoch 1970, 01, 01 midnight if anybody is interested. But this is for Julian Day Numbers which is not the same as JDE but they are similar in respect to using math to compute days and I'm sure this idea could be adapted for JDE. Sometimes people just confuse the two like I do. Sorry. But still this is an example of using a time reference which should always be done and since most computers use this it would be just as easy for us not to get too bogged down in dates and just use days before or after this epoch.

    Since JDE is now owned by Oracle, they also now support Julian_Day. see: https://docs.oracle.com/javase/8/docs/api/java/time/temporal/JulianFields.html

    #include <stdio.h>
    #include <time.h>
    #define EPOCH (double)  2440587.5 /* Julian Day number for Jan. 01, 1970 midnight */
    int main ()
    {
     double days = time(0)/86400.0;
    
     printf ("%f days since January 1, 1970\n", days);
    
     printf ("%f\n", days + EPOCH);
    
     return 0;  
    }
    
    0 讨论(0)
  • 2020-12-03 18:26

    Save the below source code in a source member called JDEDATES. Use the runsqlstm on the first line to create the functions. You can then do things like

    select  jde2date(A1UPMJ), f.* from f00095 f                            
    

    and see a real date.

    Source:

    --RUNSQLSTM SRCFILE(qtxtsrc) SRCMBR(JDEDATES) COMMIT(*NONE)  NAMING(*SQL) 
     -- jde 2 date                                                                    
    
     create function QGPL/jde2date ( d decimal(7,0))                                  
     returns date                                                                     
     language sql                                                                     
     deterministic                                                                    
     contains sql                                                                     
        SET OPTION DATFMT=*ISO                                                        
     BEGIN                                                                            
      if d=0 then return null;                                                        
      else                                                                            
           return date(digits(decimal(d+1900000,7,0)));                               
      end if;                                                                         
     end;                                                                            -- date 2 jde                                     
     create function QGPL/date2jde ( d date)           
     returns decimal(7,0)                              
     language sql                                      
     deterministic                                     
     contains sql                                      
        SET OPTION DATFMT=*ISO                         
     BEGIN                                             
      if d is null then return 0;                      
      else                                             
      return (YEAR(D)-1900)*1000+DAYOFYEAR(D);         
      end if;                                          
     end ;                                              
    
    0 讨论(0)
提交回复
热议问题