将日期时间插入 sql 时缺少毫秒数

Milliseconds missing when insert date time to sql

我使用用户定义 table 参数进行批量插入,我创建了用户定义 table 并且列名称是日期时间

数据类型中的 ModifiedDate

当我将值传递给 sql 时,它会正常插入,但它错过了毫秒值,那么我该如何安装这个

我的用户定义table

CREATE TYPE [dbo].[Test] AS TABLE(
[ModifiedDate] [datetime] NOT NULL,
)

我的 Sp

ALTER PROCEDURE [dbo].[CP_UpdateData]
-- Add the parameters for the stored procedure here
 @Test Test Readonly,

  INSERT into Test(ModifiedDate)
       Values(ModifiedDate);

但是我的日期时间值缺少毫秒,请问您能否提供解决此问题的任何建议

通过 C# 代码

using (var cmd = new SqlCommand())
{
    cmd.CommandText = "CP_UpdateData";
    cmd.Connection = con;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("Test", SqlDbType.Structured).Value = ConvertToDataTable(list);                       
    con.Open();
    var dataReader = await cmd.ExecuteReaderAsync();
}

public DataTable ConvertToDataTableCampaingList(List<Test> list)
{
    var dataTable = new DataTable();

    if (list != null && list.Count > 0)
    {
     dataTable.Columns.Add("ModifiedDate", Type.GetType("System.DateTime"));
     foreach (var data in list)
        {
        var dataRow = dataTable.NewRow();
        dataRow["ModifiedDate"] = data.ModifiedDate;
         dataTable.Rows.Add(dataRow);
        }
    }
    return dataTable;
}

答案在CHAT ROOM讨论中,我会post在这里: 问题在于隐式转换以及每个编译器如何处理数据。 DATETIME 默认没有定义 FORMAT,因此 SQL 隐式转换数据。

So the issue is when your storing it into the table as the Default formatting is the problem CREATE TABLE #Example2 (TIMES DATETIME NOT NULL) INSERT INTO #Example2 (TIMES) VALUES (CONVERT(DATETIME, GETDATE(), 9)) , (CAST(GETDATE() AS VARCHAR(20) ) ) Notice how the default in a simple string actually drops milliseconds since its format is wrong

注意解决方案是 explicitly 定义格式:

  • 马尼坎丹写道:

    When i convert the var date = (DateTime.Parse(datetime.ToString("yyyy-MM-dd HH:mm:ss.fff"))); it return correct milliseconds

将 DATETIME 转换为字符串使其具有可移植性,并且采用不会截断数据的数据类型。但是,如果保证准确性,请使用适当的 CONVERT(数据类型、表达式、样式)。

  • 马尼坎丹写道:

    DECLARE @TEMP_Result TABLE ( ModifiedDate DATETIME )

    DECLARE @TEMp TABLE 
    ( 
    ModifiedDate  varchar(50) 
    ) 
    
    declare @timestring varchar(50) 
    
    set @timestring = '2016-06-28 12:53:20.850' 
    
    Insert into @TEMp(ModifiedDate) 
    values(@timestring) 
    
    Insert into @TEMP_Result(ModifiedDate) 
    select Convert(datetime, ModifiedDate) from @TEMp 
    
    
    select * from @TEMP_Result
    

道德:谨防隐式转换

  • Implicit 转换是猜测,由编译器决定。它们不可靠 ,如本例所示

  • CAST不是显式转换,可能return格式不对。在 SQL 中使用 CONVERT 以避免隐式转换。

  • 在字符串中存储 DATETIME 使其可移植,避免 TRUNCATION 的数据,并且很容易转换为 SQL 中的正确格式。