比较时两个日期时间项目不同

时间:2015-10-28 15:30:23

标签: c# .net sql-server datetime

我遇到了datetime元素的问题。 我使用SP存储datetime值(lastwritetime),我从FileInfo元素中获取它。

当我将数据插入数据库时​​,值很好:

我使用此SP来插入我的数据:

ALTER PROCEDURE [dbo].[ps_AddImageToCategory](
    @catID numeric(6,0),
    @newImageName varchar(50),
    @newImageJpgLoc varchar(255),
    @newImageTargaLoc varchar(255),
    @newImageIsInUse int,
    @dateCreation datetime,
    @dateexpiration datetime)
AS
BEGIN
    SET XACT_ABORT, NOCOUNT ON
    DECLARE @starttrancount int

    BEGIN TRY
        SELECT @starttrancount = @@TRANCOUNT
        IF @starttrancount = 0
            BEGIN TRAN ps_AddImageToCategory_tran
        INSERT INTO [dbo].[ZIMG_Image] 
                  (CIMG_ID,
                   IMG_Name, 
                   IMG_Localisation, 
                   IMG_TargaFile, 
                   InUse, 
                   IMG_DateCreation,
                   IMG_DateExpiration)
            VALUES(@catID, 
                   @newImageName,
                   @newImageJpgLoc, 
                   @newImageTargaLoc, 
                   @newImageIsInUse,
                   @dateCreation,
                   @dateexpiration)
        IF @starttrancount = 0
            COMMIT TRAN ps_AddImageToCategory_tran
    END TRY
    BEGIN CATCH     
        IF XACT_STATE() <> 0 AND @starttrancount = 0
        BEGIN
            ROLLBACK TRAN ps_AddImageToCategory_tran
            EXECUTE [dbo].[isp_LogError]
        END
        EXECUTE [dbo].[isp_RaiseError]
    END CATCH
END

我用这段代码打电话给我的SP:

public bool InsertZimgImage(ZIMG_Image imageToInsert)
{
    using (var conn = InitSqlConnection())
    using (var cmd = new SqlCommand("ps_AddImageToCategory", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@catID", imageToInsert.CIMG_ID);
        cmd.Parameters.AddWithValue("@newImageName", imageToInsert.IMG_Name);
        cmd.Parameters.AddWithValue("@newImageJpgLoc", imageToInsert.IMG_Localisation);
        cmd.Parameters.AddWithValue("@newImageTargaLoc", imageToInsert.IMG_TargaFile);
        cmd.Parameters.AddWithValue("@newImageIsInUse", (imageToInsert.InUse ? 1 : 0));
        cmd.Parameters.AddWithValue("@dateCreation", imageToInsert.IMG_DateCreation);
        cmd.Parameters.AddWithValue("@dateexpiration", imageToInsert.IMG_DateExpiration);
        conn.Open();
        if (cmd.ExecuteNonQuery() != 0)
            return true;
    }
    return false;
}

之后,我每小时检查一次我文件的lastwritetime是否与数据库中的值不同。如果它是différents,我更新数据库并进行一些操作。

我的错误是当我进行DateTime.Compare操作时。 实际上,数据值永远不会相同。即使我们不编辑文件。 我的第一个屏幕截图是插入数据库的日期时间的调试值:

第二个屏幕截图是关于FileInfo元素中的日期时间:

enter image description here

我当然看到价值HourKindTicks不同,但我无法解释原因。 为了您的信息,我一直在我的C​​#程序中使用对象DateTime,并且我没有改变发送到我的SP的DateTime项目。 看起来插入数据库时​​会丢失数据

我希望有人可以向我解释为什么我在两个相同日期之间存在这种差距以及如何解决这个问题。感谢

1 个答案:

答案 0 :(得分:2)

这里发生了两件事情的混合

  1. 您文件的创建日期有一个隐含的时区 - 由Kind=Local表示,当您将日期存放在数据库中时,会丢失该信息。
  2. datetime values in SQL Server的精度四舍五入为.000,.003或.007秒的增量。这解释了为什么762毫秒变为763.
  3. 因此,你永远不会在这些日期之间取得平等。

    解决方法又是双重的

    1. 选择明确存储UTC日期/时间,以消除所有时区问题。
    2. 比较日期时,只比较日,月,年,小时,分钟和日期。第二部分。从数据库中检索日期时间时忽略毫秒。