- PR -

CONVERTによる日付形式の指定方法

1
投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-02-26 11:48
お世話になります。

SQLサーバー2000(SP4)を使用しています。
テーブルのあるフィールドに日付データがセットされています。
 ・フィールド:BLDAT
 ・データ型:VARCHAR
 ・サイズ:8
 ・値:20000208

このデータを「2000/02/08」として日付形式を変更して取得したいので、以下のようなSQL文を実行したのですが、思うような結果になりませんでした。
 SELECT CONVERT(NVARCHAR(10), BLDAT, 111) FROM テーブル → 20000208

そこで一度、CASTを間に入れて以下のようにするとうまくいきました。
 SELECT CONVERT(NVARCHAR(10), CAST(BLDAT AS DATETIME), 111) FROM テーブル → 2000/02/08

でもこんな強引なやり方で正しいのでしょうか?
単純にVBで「FORMAT関数」を使用するようにCONVERTで変換できないのでしょうか?
いまいちCONVERTが理解できずに困っています。
他に簡潔で良い方法があればアドバイスをお願いします。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-02-26 11:59
まず datetiem に変換しないと無理。
そうしないと文字列から文字列に変換しようとしているだけなので、style=111 は意味を持たない。

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-02-26 12:04 ]
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-02-26 12:27
未記入さん、レスありがとうございます。

では、やはり
 SELECT CONVERT(NVARCHAR(10), CAST(BLDAT AS DATETIME), 111) FROM テーブル
とやるしかないと言うことですよね。
了解です、この方法で進めて行こうと思います。
ありがとうございました!

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-02-26 14:31
SQL Serverに変換を任せず、自分で文字連結する方法もあります。

コード:
SELECT SUBSTRING(BLDAT,1,4)+'/'
           +SUBSTRING(BLDAT,5,2)+'/'
           +SUBSTRING(BLDAT,7,2)
 FROM テーブル 

ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-02-26 16:16
忠犬さん、いつもお世話になります。

「CONVERTとCASTの合わせ技」と「SUBSTRING」を使用するのとどちらが処理速度が速いのでしょうか?微々たる処理の為、体感出来る程の差は無いとは思いますが。
あとはSQL文の見た目の問題かもしれませんね。
いままでSQLサーバーから抽出した値を、VB上でFormat関数を使用して日付形式や金額形式へ変換していましたが、今後は出来る限りの処理はすべてSQLサーバーで行なわせてからVB上ではそのままの形で表示するといった形を考えています。
そうなると極力効率の良い処理を求めたいので。。。
ノラ
常連さん
会議室デビュー日: 2003/11/06
投稿数: 37
お住まい・勤務地: 東京都
投稿日時: 2008-02-26 18:29
コード:
declare @i int;
declare @bldat varchar(8);
declare @work  varchar(10);
set @i = 0;
set @bldat= '20080226';
print convert( varchar, getdate(), 121 );
while @i<1000000
begin
	SELECT @work = SUBSTRING(@BLDAT,1,4)+'/'
           +SUBSTRING(@BLDAT,5,2)+'/'
           +SUBSTRING(@BLDAT,7,2);
	set @i = @i + 1;
end;
print convert( varchar, getdate(), 121 );
と
declare @i int;
declare @bldat varchar(8);
declare @work  varchar(10);
set @i = 0;
set @bldat= '20080226';
print convert( varchar, getdate(), 121 );
while @i<1000000
begin
	SELECT @work = CONVERT(VARCHAR(10), CAST(@BLDAT AS DATETIME), 111);
	set @i = @i + 1;
end;
print convert( varchar, getdate(), 121 );


を比べると文字列操作の方が速いようですが、百万回実行して数秒の差ですからね。





未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-02-26 20:16
引用:

いままでSQLサーバーから抽出した値を、VB上でFormat関数を使用して日付形式や金額形式へ変換していましたが、今後は出来る限りの処理はすべてSQLサーバーで行なわせてからVB上ではそのままの形で表示するといった形を考えています。


「そのままの形」ってなんでしょうね。スラッシュ区切りにした日付をあらわす文字列が「そのままの形」なのかな。VB でどのように扱うかにもよりますけど、VB で日付型の変数に代入したり、日付型を扱うコントロールに表示したりするのであれば、スラッシュ区切りの文字列よりも、日付型(datetime)を返したほうが扱いやすいのかもしれませんよ。

それなら、convert(datetime, BLDAT, 112) で済むし。
1

スキルアップ/キャリアアップ(JOB@IT)