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. mysql_queryが結果を返したかどうかを確認する最良の方法は?

    2. mysqlでローカル変数とプリペアドステートメントにselectを使用する

    3. Eclipse-動的Webプロジェクトに.jarを追加します

    4. JOINの問題:解決するSQL文を修正してください:ORA-01799:列がサブクエリに外部結合されていない可能性があります