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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

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

    分類:[.NET 全般] 

    VB2008の超初心者です。
    datetimepickerを使用して、日付が表示されます。
    yyyy/mm/ddと表示されます。
    これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。
    お手数をおかけしますが、ご教授をよろしくお願いいたします。
親記事 /過去ログ176より / 関連記事表示
削除チェック/

■101073  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ WebSurfer -(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 型にするというのが具体的にどうしたいのですか・
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101075  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 -(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
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101074  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ KOZ -(2022/12/26(Mon) 18:33:19)
    No101072 (やっほー さん) に返信
    > datetimepickerを使用して、日付が表示されます。
    > yyyy/mm/ddと表示されます。
    > これを日付型ではなくて、Numeric型でSQLserverへ更新をしたいです。

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

    ということでしょうか?
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101076  Re[2]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 -(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
    のようにして、現在のスレッドのカルチャを差し替えておくという手もあります。
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101077  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ 魔界の仮面弁士 -(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」などとして検索すると、いくつかの案が見つかるでしょう。
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101078  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ radian -(2022/12/27(Tue) 09:40:35)
    2023/01/11(Wed) 15:53:29 編集(投稿者)

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

    そもそも今のDBって、殆ど日付型格納出来るデータ型ありますけど、何故日付型のまま格納しないんですか?
    時々数値や文字列に変換して入れる人いるけど、無駄な変換処理が格納・取り出しの度に必要になるし、
    バグの元になるのでやめた方がいいです。
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/

■101081  Re[1]: VB2008 datetimepickerの型を変更したい。
□投稿者/ HattariB -(2022/12/27(Tue) 20:58:45)
    No101072 (やっほー さん) に返信
    > VB2008の超初心者です。
    日付を数値化する方法は、すでにいくつかご紹介されてるので、注意点をいくつか。。。

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

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

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

    年月日自噴病ですべての計算ができる場合は、この限りではないです。
    オイラはできないから、積算とかする場合はシリアル化しちゃうけどw
記事No.101072 のレス /過去ログ176より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -