将日期时间插入sql

时间:2016-06-29 06:00:23

标签: c# sql-server datetime stored-procedures table-valued-parameters

我使用用户定义表参数进行批量插入,我创建用户定义表,列名称为dated的数据类型的ModifiedDate

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

我的用户定义表

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

My Sp

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

  INSERT into Test(ModifiedDate)
       Values(ModifiedDate);

但是这里我的日期时间值缺少毫秒,请你帮忙解决这个问题的任何建议

in c#code

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;
}

1 个答案:

答案 0 :(得分:1)

答案在CHAT ROOM讨论中,我将在此处发布: 问题是隐式转换以及每个编译器如何处理数据。默认情况下,DATETIME没有定义FORMAT,因此SQL会隐式转换数据。

  

所以问题是当你将它作为默认值存储到表中时   格式化是问题CREATE TABLE#Example2(TIMES DATETIME NOT   NULL)INSERT INTO#Example2(TIMES)VALUES(CONVERT(DATETIME,   GETDATE(),9)),(CAST(GETDATE()AS VARCHAR(20)))注意如何   默认情况下,一个简单的字符串实际上会减少毫秒数   格式错误

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

  • Manikandan写道:
      

    当我转换var date =时   (DateTime.Parse(datetime.ToString(&#34; yyyy-MM-dd HH:mm:ss.fff&#34;)));它   返回正确的毫秒数

将DATETIME转换为字符串使其可移植,并且处于不会对数据进行TRUNCATE的数据类型。但是,如果确保准确性,请使用正确的CONVERT(数据类型,表达式,样式)。

  • Manikandan写道:
      

    DECLARE @TEMP_Result表       (       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不是显式转换,可能会返回错误的格式。使用CONVERT中的SQL可避免隐式转换。

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