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

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

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

Re[1]: VB2008 datetimepickerの型を変更したい。


(過去ログ 176 を表示中)

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

■101072 / inTopicNo.1)  VB2008 datetimepickerの型を変更したい。
  
□投稿者/ やっほー (1回)-(2022/12/26(Mon) 16:59:04)

分類:[.NET 全般] 

VB2008の超初心者です。
datetimepickerを使用して、日付が表示されます。
yyyy/mm/ddと表示されます。
これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。
お手数をおかけしますが、ご教授をよろしくお願いいたします。
引用返信 編集キー/
■101073 / inTopicNo.2)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ WebSurfer (2600回)-(2022/12/26(Mon) 17:27:43)
No101072 (やっほー さん) に返信

> yyyy/mm/ddと表示されます。これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。

SQL Server の numeric 型というのは以下の通りですが何か思い違いしてませんか?

decimal 型と numeric 型 (Transact-SQL)
https://learn.microsoft.com/ja-jp/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver16

思い違いでないとすると、例えば DateTimePicker の値が 2022/12/26 17:25:30 の場合、
それを numeric 型にするというのが具体的にどうしたいのですか・
引用返信 編集キー/
■101074 / inTopicNo.3)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ KOZ (380回)-(2022/12/26(Mon) 18:33:19)
No101072 (やっほー さん) に返信
> datetimepickerを使用して、日付が表示されます。
> yyyy/mm/ddと表示されます。
> これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。

Dim value As Integer = Integer.Parse(DateTimePicker1.Value.ToString("yyyyMMdd"))

ということでしょうか?
引用返信 編集キー/
■101075 / inTopicNo.4)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 (3515回)-(2022/12/26(Mon) 18:45:17)
No101072 (やっほー さん) に返信
> datetimepickerを使用して、日付が表示されます。
> yyyy/mm/ddと表示されます。
既定の表示はそうですが、実際には時刻部も含むことに注意してください。

「DatePicker」ではなく
「DateTimePicker」ですからね。

たとえば、デザイン時に貼り付けたときの日時が初期値となっており、
その日時の日付部分のみが表示されているケースがしばしばあります。

そのため、DataTimePicker とデータバインドしたり Value プロパティにアクセスした際に、
見た目上は「2022/12/26」だけれど、実際に取得した値は
「2022/12/26 16:59:04.468」だった…という事故が起こりえます。

実際に必要なのが日付部だけの場合は、
 Dim dt As Date = DateTimePicker1.Value.Date
のようにして、時刻部を切り落とした「2022/12/26 00:00:00」な日付を得た方が良いかもしれません。


> これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。
どういう値に変換したいのかにもよりますが。

Dim dt As Date = #12/26/2022#

'yyyyMMdd な整数への変換
Dim 案1 As Integer = dt.Year * 10000 + dt.Month * 100 + dt.Day '20221226

'yyyy.MMdd な小数値への変換
Dim 案2 As Decimal = dt.Year + (dt.Month * 100D + dt.Day) / 10000D '2022.1226

'VBA などで使われる Variant Date な日付シリアル値への変換
Dim 案3 As Double = dt.ToOADate() '44921.0

'Windows ファイル時刻値への変換
Dim 案4 As Long = dt.ToFileTime() '133164540000000000
引用返信 編集キー/
■101076 / inTopicNo.5)  Re[2]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 (3516回)-(2022/12/26(Mon) 19:02:46)
No101074 (KOZ さん) に返信
> Dim value As Integer = Integer.Parse(DateTimePicker1.Value.ToString("yyyyMMdd"))

この手法は、OS の日付設定が和暦になっている場合に
2022年12月26日が「41226」として取得されてしまう点に注意が必要です。


もしも、OS 設定が和暦モードになっていて、
DateTimePicker も令和 4 年を指してしまっている状態であっても
西暦 2022 年な yyyyMMdd を得たい場合には、
 Dim jpCal As New System.Globalization.CultureInfo("ja-JP", False)
 jpCal.DateTimeFormat.Calendar = New System.Globalization.GregorianCalendar()
 Dim value As Integer = Integer.Parse(DateTimePicker1.Value.ToString("yyyyMMdd", jpCal))
のように、ToString メソッドを呼ぶ際に、西暦指定のカルチャを明示します。
(または、Year や Month といったプロパティから得るようにする)


毎回カルチャを指定するのが面倒な場合は、
 Dim t As System.Threading.Thread = System.Threading.Thread.CurrentThread
 Dim jpCal As New System.Globalization.CultureInfo("ja-JP", False)
 jpCal.DateTimeFormat.Calendar = New System.Globalization.GregorianCalendar()
 t.CurrentCulture = jpCal
のようにして、現在のスレッドのカルチャを差し替えておくという手もあります。
引用返信 編集キー/
■101077 / inTopicNo.6)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 (3517回)-(2022/12/27(Tue) 09:27:09)
No101072 (やっほー さん) に返信
> datetimepickerを使用して、日付が表示されます。
> yyyy/mm/ddと表示されます。
> これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。

あと、日付値の最大値・最小値についてもご注意を。

9999/12/31 を、SQL Server 側にて numeric 99991231 を管理するような場合、
DateTimePicker では最大な日付値を表せないかもしれません。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=3380&KLOG=12


あとは、対象の numeric フィールドが null 許容だった場合にどうするか。
こちらは Google で「DateTimePicker null」などとして検索すると、いくつかの案が見つかるでしょう。
引用返信 編集キー/
■101078 / inTopicNo.7)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ radian (102回)-(2022/12/27(Tue) 09:40:35)
2023/01/11(Wed) 15:53:29 編集(投稿者)

No101072 (やっほー さん) に返信
> VB2008の超初心者です。
> datetimepickerを使用して、日付が表示されます。
> yyyy/mm/ddと表示されます。
> これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。
> お手数をおかけしますが、ご教授をよろしくお願いいたします。

そもそも今のDBって、殆ど日付型格納出来るデータ型ありますけど、何故日付型のまま格納しないんですか?
時々数値や文字列に変換して入れる人いるけど、無駄な変換処理が格納・取り出しの度に必要になるし、
バグの元になるのでやめた方がいいです。
引用返信 編集キー/
■101081 / inTopicNo.8)  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ HattariB (54回)-(2022/12/27(Tue) 20:58:45)
No101072 (やっほー さん) に返信
> VB2008の超初心者です。
日付を数値化する方法は、すでにいくつかご紹介されてるので、注意点をいくつか。。。

年月日時分秒を基にせずに数値化した日付シリアルデータは、起点がどこにあるのかを明確にしておいた方が良いです。
OSとかフレームワークによって、1900年だったり、0001年だったり、1600年だったりするので、同じシリアル値でも動作環境によって、異なる年月日時分秒を示してしまう事があるからね。
MS製品一式で使ってる分には関係無いのかもしれないけど。

タイムスタンプにしたいんだったら、日付書式のまま保存する事をおすすめします。
欲を書けば、ISO8601に合わせた方が良いと思います。

10進法、24進法、60進法、日跨ぎ月跨ぎ年跨ぎ、閏年とかの面倒な繰り上がり下がりを避けながら、休日、時間上限とかも考慮しながら、積算時間を算出したり、何かを計画したりといった目的で、
とある単位を設けて、シリアル化した数値によって処理する手法はありなので、数値化する事は否定しないけど、
数値化の定義は詳細に明文化し関係者に周知すべきですね。
それをおざなりにして、
「コードを読んですべてを理解しる」
といった実装は、はっきり言って迷惑なので、これは止めた方が良いです。

年月日自噴病ですべての計算ができる場合は、この限りではないです。
オイラはできないから、積算とかする場合はシリアル化しちゃうけどw
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -