2001-01-01 00: 00: 00.000 вставлено в базу данных вместо 2000-12-31 23:59:59 - PullRequest
7 голосов
/ 30 марта 2011

У меня есть метод, который добавляет строки в базу данных (SQL Server 2005). Что-то не так с ним, потому что, когда у меня есть строка с UpdateDate 2000-12-31 23:59:59, он вставляет 2001-01-01 00:00:00.000. Является ли это возможным? Культура окружающей среды польская, если это важно. Для меня это волшебство: /

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 (@investmentStatusesID, @enumInvestmentStatusId,
            @updateDate, @dataVersion, @modifiedBy, @modifiedOn)

END

EDIT:

моя дата:

{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

Ответы [ 3 ]

10 голосов
/ 30 марта 2011

Вы уверены, что вводите 23: 59: 59,000000 или вводите 23: 59: 59,99999999?

Тип данных SQL DateTime имеет точность 3,33 мс (округляется с шагом 0 мс, 3 мс, 7 мс)), что означает, что ваши 23: 59: 59.9999 будут округлены до 00: 00: 00.000000 следующего дня.

4 голосов
/ 30 марта 2011

Я не знаю, так ли это в вашем случае, но это известная проблема, что значения datetime, где доля миллисекунды равна .998 или .999, округляются до следующего целого второго значения при вставке в базу данных, чтов худшем случае это может привести к переносу значения datetime на следующий год.

3 голосов
/ 30 марта 2011

Если в таблице есть столбец smalldatetime, это возможно, поскольку она имеет точность 1 минута

см. Здесь

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

не происходит с датой и временем

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

Разместите DDL таблицы, убедитесь, что вы также проверили триггеры, которые могут привести меня к smalldatetime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...