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

SQL ServerのDateTimeオブジェクトをBIGINT(.Netティック)に変換します

    これを投稿するかどうかについては、SQL Serverのバイナリレベルでの日付の格納方法に依存するため、非常に脆弱なソリューションであるため、議論しました。 1回限りの変換以外の場合は、@SolutionEvangelistが投稿した回答のようなものを使用します。それでも、これは学術的な意味で興味深いと思うかもしれないので、とにかく投稿します。

    DateTime2の精度という事実を利用する .NETのティック期間と一致し、どちらも01-01-0001 00:00:00.0000000の開始日に基づいています。 、DateTimeをキャストできます DateTime2へ 、次にそれをbinary(9)にキャストします :0x07F06C999F3CB7340B

    日時情報はRTLに保存されるため、逆にすると、0x0B34B73C9F996CF007が取得されます。 。

    最初の3バイトには、01-01-0001からの日数が格納されます 次の5バイトには、その日の真夜中から100nsの目盛りが格納されるため、日数を取得し、1日の目盛りを掛けて、その日の経過時間を表す目盛りを追加できます。

    次のコードを実行します:

    set @date = getdate()
    set @ticksPerDay = 864000000000
    
    declare @date2 datetime2 = @date
    
    declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
    declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
    declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)
    
    select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]
    

    次の結果を返します:

    DateTime                DateTime2              Ticks
    ----------------------- ---------------------- --------------------
    2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000
    

    返されたティックの数を取得し、.NETでDateTimeに変換し直します:

    DateTime dt = new DateTime(634514088325870000);
    dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();
    

    SQLサーバーから日付を取得します:

    2011-09-12 07:20:32.5870000



    1. プロファイルからデータベースメールアカウントを削除する(SSMS)

    2. SQLのSUBSTRINGコマンド:入門書

    3. pyodbc.connect()は機能しますが、sqlalchemy.create_engine()。connect()は機能しません

    4. PythonでMySQLデータベースに挿入した後にIDを取得するにはどうすればよいですか?