私はJDE の日付を変換しようとしていますが、大量の情報を収集して、いくつかのタスクを簡素化するために SQL 変換関数を実行しようと考えました。
これが私が思いついた関数で、単に「ToGregorian」と呼んでいます
CREATE FUNCTION [dbo].[ToGregorian](@julian varchar(6))
RETURNS datetime AS BEGIN
DECLARE @datetime datetime
SET @datetime = CAST(19+CAST(SUBSTRING(@julian, 1, 1) as int) as varchar(4))+SUBSTRING(@julian, 2,2)+'-01-01'
SET @datetime = DATEADD(day, CAST(SUBSTRING(@julian, 4,3) as int)-1, @datetime)
RETURN @datetime
END
- 「ジュリアン」文字列を取ります。
- 最初の文字を取り、19 から始まる世紀に追加します。
- 次の 2 文字から 10 年と年を追加します。
- 最後に、最後の 3 文字である日を追加し、最初のセットアップですでに 1 日あったため、1 を減算します。(例: 2011-01-01)
- 結果の例:
111186
=>2011-07-05 00:00:00.000
私の意見では、これは少し不器用でやり過ぎです。これを行うためのより良い方法があることを願っています。おそらく私はあまりにも多くの変換を行っていますか、それとも別の方法を一緒に使用する必要がありますか?
機能を改善するためのアドバイスはありますか?
おそらく、別のより良い方法でしょうか?
もっと読みやすくなっても構いません...
インライン バージョンもあります。たとえば、読み取り権限しかなく、関数を使用できない場合、これも乱雑に見えますが、より読みやすく、またはより良くすることは可能ですか?
CAST(REPLACE(Convert(VARCHAR, DATEADD(d,CAST(SUBSTRING(CAST([column] AS VARCHAR), 4,3) AS INT)-1, CAST(CAST(19+CAST(SUBSTRING(CAST([column] AS VARCHAR), 1,1) AS INT) AS VARCHAR)+SUBSTRING(CAST([column] AS VARCHAR), 2,2) + '-01-01' AS DATETIME)), 111), '/', '-') AS DATETIME)