从DateTimeOffset大于或等于C#DateTime的SQL Server表中删除
我有一个SQL Server表,其中包含数据,每行都有一个名称和一个DateTimeOffset字段。 现在,我想从表中删除所有数据,其中DateTimeOffset字段包含的值大于我在C#应用程序中拥有的DateTime(UTC)对象,这样我就可以在以后插入新数据,而不必在表中重复数据。下面是一个我如何在C#中尝试这样做的示例:从DateTimeOffset大于或等于C#DateTime的SQL Server表中删除,c#,sql-server,datetime,datetimeoffset,C#,Sql Server,Datetime,Datetimeoffset,我有一个SQL Server表,其中包含数据,每行都有一个名称和一个DateTimeOffset字段。 现在,我想从表中删除所有数据,其中DateTimeOffset字段包含的值大于我在C#应用程序中拥有的DateTime(UTC)对象,这样我就可以在以后插入新数据,而不必在表中重复数据。下面是一个我如何在C#中尝试这样做的示例: DateTime timestamp=data.timestamp.UtcTime//28.10.2020 15:00:00 UTC 使用(SqlCommand命令=
DateTime timestamp=data.timestamp.UtcTime//28.10.2020 15:00:00 UTC
使用(SqlCommand命令=新的SqlCommand($“从其中删除Name=@p\u Name AND Time>=@p\u timestamp”,conn))
{
Add(新的SqlParameter(“p_name”,SqlDbType.NVarChar){Value=“ExampleName”});
Add(新的SqlParameter(“p_timestamp”,SqlDbType.DateTimeOffset){Value=timestamp});
command.ExecuteNonQuery();
}
执行此语句后,我仍然可以在表中找到时间字段为“2020-10-28 15:00:00.0000000+01:00”的行。为什么?我已经尝试使用
SqlDbType.DateTime
或SqlDbType.DateTime2
而不是SqlDbType.DateTimeOffset
,但这并没有解决问题。将时间戳转换为DateTimeOffset
对象也没有什么区别。我用于此delete语句的时间戳与后来插入数据时使用的时间戳完全相同,因此这里可能存在什么问题?您是否考虑过在C中使用DateTimeOffset
作为DateTime
的日期类型?考虑到您在SQL Server中处理的是datetimeoffset
,在C#中使用相同的数据类型似乎是合适的。@Larnu是的,但正如我所说的,这没有什么区别。但是,不要只是将行更改为datetimeoffset timestamp=data.timestamp.UtcTime代码>;这可能会将该值设置为当前UTC时间,但使用本地主机的当前偏移量。实际上,给它一个DateTimeOffset
值。例如,如果它是您需要的当前时间,那么它似乎是DateTimeOffset.Now()
@Larnu,那么应该如何正确地执行呢?我现在有点太困惑了,甚至不能确定插入是否正确。DateTimeOffset中的偏移量是应该添加到它的datetime部分以获得实际的UTC时间,还是没有偏移量的部分是UTC时间并添加偏移量将产生本地时间?阅读您的文章时,实际上,您声明该值为28.10.2020 15:00:00Z
,并且您正在删除are上的行<代码>2020-10-28 15:00:00.0000000+01:00
是2020-10-28 14:00:00.0000000+00:00
,因此不在后面,因此不应删除。这只是对时区工作原理的一个简单误解。
DateTime timestamp = data.Timestamp.UtcTime; //28.10.2020 15:00:00 UTC
using (SqlCommand command = new SqlCommand($"DELETE FROM <tablename> WHERE Name = @p_name AND Time >= @p_timestamp", conn))
{
command.Parameters.Add(new SqlParameter("p_name", SqlDbType.NVarChar) { Value = "ExampleName" });
command.Parameters.Add(new SqlParameter("p_timestamp", SqlDbType.DateTimeOffset) { Value = timestamp });
command.ExecuteNonQuery();
}