sql >> データベース >  >> RDS >> Sqlserver

VB.NETでDateTimeを16進数に変換する

    この回答は、.NET DateTimes から SQL Server の datetime と同等のバイナリ形式への変換に単純に対応しています。 データ型なので、別の回答を保証するのに十分なほど異なると思います( こちら こちら 大丈夫だったことを確認してください)。

    @Martin Smith が指摘したように、 datetime のバイナリ形式 特定の時点からの単なるティック数ではありません。

    datetime 最初の 4 バイトは 1900 年 1 月 1 日からの日数であり、次の 4 バイトはその日の午前 0 時からの「ティック」数であり、ティックは 10/3 ミリ秒です。 /P>

    .NET DateTime を同等のバイナリ表現に変換するには、'01-01-1900' 以降の日数を特定し、それを 16 進数に変換してから、午前 0 時からのティック数を計算する必要があります。 .NET ティックは 100ns です。

    例:

    DateTime dt = DateTime.Now;
    DateTime zero = new DateTime(1900, 1, 1);
    
    TimeSpan ts = dt - zero;
    TimeSpan ms = ts.Subtract(new TimeSpan(ts.Days, 0, 0, 0));
    
    string hex = "0x" + ts.Days.ToString("X8") + ((int)(ms.TotalMilliseconds/3.33333333)).ToString("X8");
      

    このコードを実行すると、 dt 9/14/2011 23:19:03.366 でした 、そして hex を設定します 0x00009F5E018043212011-09-14 23:19:03.363 に変換されます

    四捨五入が原因で、正確な日付を取得するのに常に問題があると思いますが、日時が正確に一致する必要がないクエリをミリ秒単位で使用できる場合、これは十分に近いものになる可能性があります。

    編集

    投稿した最初の回答の下のコメントで、SQL Server 2008 について尋ねました。datetime2 データ型は 100 ナノ秒の精度で時間を保存します (少なくとも、デフォルトの精度で行います)。これは .NET とうまく一致します。それが SQL Server のバイナリ レベルでどのように格納されるかに興味がある場合は、私の答え 古い質問へ。



    1. AmazonRDSでmysqladminflush-hostsを実行する方法

    2. 検索はすべての製品を表示しています

    3. user_objectsのようなシステムビューの完全な定義(sql)を取得するにはどうすればよいですか?

    4. 配列をフィールド値として保存したり、配列値をレコードとして保存したりするのは良い考えですか?