すべての日時は、有限の長さのスパンではなく、時間内の瞬間であり、1 日だけ存在できます。真夜中を表す瞬間は、定義上、翌日、それが 1 日の始まりである日です。 1 つのカレンダー日付内の時間値は、00:00:00.00000 から 23:59:59.9999 まで変化します。
これは、1 時間の分の値を 0 から 59 ではなく 1 から 60 まで変化させ、60 の値は前の時間の最後の分であると要求することに似ています。
あなたが話しているのは、表示の問題だけです。2013 年 1 月 1 日 24:00 のように日付を入力できたとしても (24:00:00 は法定時刻ではありません)、2013 年 1 月 2 日の終わりではなく、日付の開始時刻として入力されます。 1 月1 日
これを示す 1 つのことは、丸め (SQL は約 300 ミリ秒以内にしか日時を解決できない) のために、真夜中の数ミリ秒前の日時を作成すると、真夜中に切り上げられることに注意してください。次の日に移動します。これは、エンタープライズ マネージャーで次のコマンドを実行するとわかります...
Select cast ('1 Jan 2013 23:59:59.999' as datetime)
SQL サーバーはすべての日時を 2 つの整数として格納します。1 つは 1900 年 1 月 1 日からの日数を表し、もう 1 つは午前 0 時からのティック (1 ティックは 1/300 秒、約 3.33 ミリ秒) の数を表します。午前 0 時以降の時間間隔がゼロの場合は、前日ではなく同じ日です。
真夜中の 00:00:00 が 1 日の終わりを意味すると想定してデータを挿入していた場合は、それを修正する必要があります。
既存のデータを修正する必要がある場合は、データベース内の時刻コンポーネントとして午前 0 時を含む (つまり、時刻コンポーネントがゼロの) すべての日付に 1 日を追加する必要があります。
Update tbale set
date_time = dateAdd(day, 1, date_time)
Where date_time = dateadd(day, datediff(day, 0, date_time), 0)