C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 日付型のデータをSUBSTRで切り出した時の結果の違いについ


(過去ログ 178 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■101971 / inTopicNo.1)  日付型のデータをSUBSTRで切り出した時の結果の違いについ
  
□投稿者/ 黒猫 (1回)-(2023/05/23(Tue) 10:21:32)

分類:[VB.NET/VB2005 以降] 

開発環境:win10,Oracle12c,VB2012
Oracleサーバ:19c

Oracle19cに対応する為、接続文字列を@からAへ変更しました。
しかし、日付型のデータをSUBSTRで切り出した時、接続文字列@とAで結果が異なります。
SUBSTR(START_DATE, 1, 5)部分をTO_CHAR(START_DATE, 'YY-MM')で書き直すしかないのでしょうか?
御存じの方いらっしゃいましたら宜しくお願い致します。

Dim DB As ADODB.Connection
Dim Con As String
Dim RS As ADODB.Recordset

DB = New ADODB.Connection()
@Con = "Provider = MSDAORA.1;Data Source=TEST;USER ID=TEST_USER/TEST_PASS"
ACon = "Provider = OraOLEDB.Oracle;Data Source=TEST;USER ID=TEST_USER;Password=TEST_PASS"
DB.Open(Con)

RS = New ADODB.Recordset

RS.Open("Select SUBSTR(START_DATE, 1, 5) As A From TEST_TABLE", DB)

Debug.Print(ADO_RS("A").Value)
@で接続したとき・・・23-05
Aで接続したとき・・・2023-

引用返信 編集キー/
■101974 / inTopicNo.2)  Re[1]: 日付型のデータをSUBSTRで切り出した時の結果の違いについ
□投稿者/ radian (130回)-(2023/05/23(Tue) 11:09:06)
2023/05/23(Tue) 11:24:48 編集(投稿者)

No101971 (黒猫 さん) に返信
> 開発環境:win10,Oracle12c,VB2012
> Oracleサーバ:19c
>
> Oracle19cに対応する為、接続文字列を@からAへ変更しました。
> しかし、日付型のデータをSUBSTRで切り出した時、接続文字列@とAで結果が異なります。
> SUBSTR(START_DATE, 1, 5)部分をTO_CHAR(START_DATE, 'YY-MM')で書き直すしかないのでしょうか?
> 御存じの方いらっしゃいましたら宜しくお願い致します。

DBドライバが変わればフォーマットが変わる事もあり得るので、
どちらでも対応出来るようSQLを書き直すなり、
日付型で取得してプログラム側で自分でフォーマットするなりしてください。

私は、そういうDBドライバ側の問題に巻き込まれたくないので、
なるべくSQL側では日付型を加工しないですね。
引用返信 編集キー/
■101976 / inTopicNo.3)  Re[1]: 日付型のデータをSUBSTRで切り出した時の結果の違いについ
□投稿者/ 魔界の仮面弁士 (3649回)-(2023/05/23(Tue) 11:48:46)
No101971 (黒猫 さん) に返信
> SUBSTR(START_DATE, 1, 5)部分をTO_CHAR(START_DATE, 'YY-MM')で書き直すしかないのでしょうか?

START_DATE の型は DATE 型ですか? だとしたら
23-05 の方は RR-MM-DD
2023- の方は YYYY-MM-DD あるいは YYYY-MM-DD HH24:MI:SS
になっているのではないでしょうか。

SELECT * FROM V$NLS_PARAMETERS の結果が何を返すのかを確認してみましょう。
DATE 型や TIMESTAMP 型や TIMESTAMP(TZ) 型の既定の書式はセッションごとに指定できます。

ということで、「NLS パラメーター」について調べてみてください。
たとえば接続直後に
 ALTER SESSION SET NLS_CALENDAR='GREGORIAN';
を呼んでおくなど(もしくは NLS 系の環境変数で)。
https://www.sql-dbtips.com/architecture/nls_date_format/
https://docs.oracle.com/cd/E16338_01/server.112/b56307/ch3globenv.htm


適切な既定の書式を割り当てておけば、いきなり SUBSTR で切り出しても
望むべき結果が得られるかと思います。

まぁ、非文字列型の値をいきなり SUBSTR で切り出すのがそもそも手抜き処理なので
本来は TO_CHAR を併用すべきではあるのですが……どっちにしてもロケール指定が
明確でなければ、YY-MM の結果も変わってくる可能性があったりします。

たとえば
 ALTER SESSION SET NLS_CALENDAR='Japanese Imperial';
だった場合、
 SELECT TO_CHAR(SYSDATE, 'YY-MM') FROM DUAL;
の結果は「23-05」ではなく「05-05」になります。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -