将日期时间插入 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
中的正确格式。
我使用用户定义 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
中的正确格式。