次のデータセットがあります:
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