开发者

2001-01-01 00:00:00.000 inserted into database instead 2000-12-31 23:59:59

开发者 https://www.devze.com 2023-02-20 10:20 出处:网络
I have a method which adds row to database (sql server 2005). Something is wrong with its because , when I have a row with UpdateDate 2000-12-31 23:59:59it inserts 2001-01-01 00:00:00.000. Is it possi

I have a method which adds row to database (sql server 2005). Something is wrong with its because , when I have a row with UpdateDate 2000-12-31 23:59:59 it inserts 2001-01-01 00:00:00.000. Is it possible? Culture of environment is polish if it is important. It's a magic for me :/

private void AddInvestmentStatus(InvestmentData.StatusyInwestycjiRow investmentStatusesRow)
{
    SqlCommand cmd = new SqlCommand("AddInvestmentStatus");
    cmd.CommandType = CommandType.StoredProcedure;


    SqlParameter param1 = new SqlParameter("@InvestmentId", SqlDbType.BigInt);
    param1.Value = investmentStatusesRow.InvestmentId;
    cmd.Parameters.Add(param1);
    cmd.Parameters.AddWithValue("@enumInvestmentStatusID", investmentStatusesRow.EnumInvestmentStatusID);
    cmd.Parameters.AddWithValue("@modifiedBy", "System");
    cmd.Parameters.AddWithValue("@UpdateDate", investmentStatusesRow.UpdateDate);
    cmd.Parameters.AddWithValue("@ModifiedOn", investmentStatusesRow.ModifiedOn);
    cmd.Parameters.AddWithValue("@dataVersion", investmentStatusesRow.DataVersion);


    cmd.Connection = new SqlConnection(MyProgram.Properties.Settings.Default.ConnectionString);
    if (cmd.Connection.State != ConnectionState.Open)
        cmd.Connection.Open();

    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        throw;
    }
}

}

create PROCEDURE [dbo].[AddInvestmentStatus] 
    @inwestmentID bigint,
    @enumInvestmentStatusId bigint,
    @updateDate datetime,
    @dataVersion int,
    @modifiedBy nvarchar(50),
    @modifiedOn datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @investmentStatusesID bigint

    INSERT INTO StatusyInwestycji(InwestycjaID)
    VALUES (@inwestmentID)

    SELECT @investmentStatusesID = SCOPE_IDENTITY();

    INSERT INTO StatusyInwestycjiData(InvestmentStatusId, EnumStatusInwestycjiID,
            UpdateDate, DataVersion, ModifiedBy, ModifiedOn)
    VALUES (开发者_如何学Go@investmentStatusesID, @enumInvestmentStatusId,
            @updateDate, @dataVersion, @modifiedBy, @modifiedOn)

END

EDIT:

my date:

{2000-12-31 22:59:59}
    Date: {2000-12-31 00:00:00}
    Day: 31
    DayOfWeek: Sunday
    DayOfYear: 366
    Hour: 22
    Kind: Utc
    Millisecond: 999
    Minute: 59
    Month: 12
    Second: 59
    Ticks: 631139003999990000
    TimeOfDay: {22:59:59.9990000}
    Year: 2000


Are you sure you're entering 23:59:59.000000 or are you entering 23:59:59.9999999?

SQL DateTime datatype has precision of 3.33ms (it will round to 0ms, 3ms, 7ms increments), meaning your 23:59:59.9999 will be rounded to 00:00:00.000000 of the next day.


I don't know if this is what happens in your case, but it's a known issue that datetime values where the millisecond portion is .998 or .999 get rounded to the next whole second value when inserted in the database, which in the worst case scenario can lead a datetime value to wrap into the following year.


If the table has a smalldatetime column it is possible, since it has precision of 1 minute

see here

select CONVERT(smalldatetime,'2000-12-31 23:59:59')

doesn't happen with datetime

select CONVERT(datetime,'2000-12-31 23:59:59')

Post the DDL of the table, make sure to also check for triggers that might me casting to smalldatetime

0

精彩评论

暂无评论...
验证码 换一张
取 消