sql - 年と月を連結しますが、サイズは固定です

okwaves2024-01-25  8

次のデータセットがあります:

CREATE TABLE my_table (
    the_debt_id varchar(6) NOT NULL, 
    the_debt_due date NOT NULL, 
    the_debt_paid timestamp NOT NULL
);

INSERT INTO my_table
VALUES ('LMUS01', '2020-08-02', '2020-05-18 11:07:01'), 
       ('LMUS01', '2020-07-02', '2020-05-18 11:07:01'), 
       ('LMUS01', '2020-06-02', '2020-05-18 11:07:01'), 
       ('LMUS01', '2020-05-02', '2020-04-28 02:28:41'),
       ('LMUS01', '2020-04-02', '2020-04-01 06:29:53'),
       ('LMUS01', '2020-03-02', '2020-03-02 07:30:59'),   
       ('LMUS01', '2020-02-02', '2020-01-31 06:58:18');

debt_due の年と月を連結したかっただけですが、これを試してみると次のようになります。

SELECT the_debt_id, 
cast(concat(extract('year' from the_debt_due),extract('month' from the_debt_due)) as integer) 
FROM my_table

1 月から 9 月までの月については 5 桁 (5 月の場合は 20205 など)、残りの月については 6 桁 (12 月の場合は 202012 など) が返されます。 6桁を取得することは可能ですか?これは予想される出力です:

the_debt_id    concat     
LMUS01         202008
LMUS01         202007
LMUS01         202006
LMUS01         202005
LMUS01         202004
LMUS01         202003
LMUS01         202002

1

(表示用の) 文字列が必要ですか?それとも(計算を行うための)数値ですか? extract() は、あなたが持っているように、倍精度型、concat() を返します。ce-convert してテキストに変換し、最後に整数にキャストします ...

– アーウィン・ブランドステッター

2020 年 9 月 4 日 21:30

こんにちは @ErwinBrandstetter、数学の計算には整数が必要です。すでにご回答いただいたようです、ありがとうございます!

– マヌ

2020 年 9 月 4 日 22:01



------------------------

表示には、GMB が提供する to_char() を使用します。

キャストが示唆しているように、整数が必要な場合、これは t をキャストするよりも高速です。to_char() の結果:

SELECT (EXTRACT(year FROM the_debt_due) * 100 + EXTRACT(month FROM the_debt_due))::int;

この関連する回答を最適化するときに両方をテストしました。

年を無視した日付の計算はどのように行うのですか?

1

まさに必要なもの、整数です。ありがとう @Erwin Brandsetter!

– マヌ

2020 年 9 月 5 日 0:43



------------------------

パディングロジックは必要ありません。 to_char() を使用するだけです:

select the_debt_id, to_char(the_debt_due, 'yyyymm') the_debt_due_char
from mytable

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。