4

プロジェクトで問題に直面しました。日付09/03/2013 23:59:59をストアド プロシージャに渡しましたが、プロファイラー .net で .net に変換したのを見ました09/04/2013 00:00:00

小さなテスト アプリケーションを作成したことを確認するために (誰でもそれを使用して複製できます。私は .Net 4.5 と Sql サーバー 2012 Express Edition を使用しています)。

以下はテストコードです:

DateTime startdate = DateTime.Parse("09/03/2013");
DateTime endDate = startdate.AddDays(1).AddTicks(-1);
        try
        {
            using (SqlConnection konekcija = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {

                konekcija.Open();

                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = konekcija;

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "[Interface].[uspTestDateParameter]";

                    cmd.Parameters.AddWithValue("@CurrentDate", startdate);
                    cmd.Parameters.AddWithValue("@BatchEndDate", endDate);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        // Fill the DataSet using default values for DataTable names, etc
                        DataSet dataset = new DataSet();
                        da.Fill(dataset);
                        DataTable dt = dataset.Tables[0];
                        //return dataset;
                    }
                }
            }
        }
        catch (Exception ee)
        {

        }

以下に手順を示します。

CREATE PROCEDURE [Interface].[uspTestDateParameter]
(
@CurrentDate DateTime
,@BatchEndDate DateTime
) 
AS
BEGIN
Declare @table table (strt Datetime ,endT Datetime )

Insert into @table values (@CurrentDate,@BatchEndDate)

Select * from @table
END

返される結果セットは9/3/2013 12:00:00 AM 9/4/2013 12:00:00 AM

データセット ビジュアライザーのスクリーン ショットを添付することもできましたが、reputation 10 が必要なためできません。

誰か助けてくれませんか?これにより、私のprocsは本番環境で失敗します。

4

3 に答える 3

4

DATETIMEここで説明されているように丸められます。

http://technet.microsoft.com/en-us/library/ms187819.aspx

この記事では、すべての値が .000、.003、または .007 秒前後であると明示的に述べています。ユーザー指定の DateTime01/01/98 23:59:59.999は常に として保存され1998-01-02 00:00:00.000ます。

ティックを使用する代わりに、次のことができないのはなぜですか?

DateTime endDate = startdate.AddDays(1).AddSeconds(-1);

これは、次の秒よりも 1 ティック短いのではなく、( ) を渡すと言った日付を実際に渡します。09/03/2013 23:59:59

または、SQL データ型として使用DATETIME2します。ドキュメントによると、精度は 100ns (1 ティック) です。

http://technet.microsoft.com/en-us/library/bb677335.aspx

于 2013-09-06T18:17:59.977 に答える
0

ティックは時間の非常に小さな単位です ( MSDN )。ミリ秒には 10,000 ティックがあります。

1 ~ 2 秒引いてみて、機能するかどうかを確認してください。

ところで、SQL Server の datetime は 333 ミリ秒しか格納できません (例: .000、.003、.006 など)

于 2013-09-06T18:22:44.367 に答える