从DateTimeOffset大于或等于C#DateTime的SQL Server表中删除

从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命令=

我有一个SQL Server表,其中包含数据,每行都有一个名称和一个DateTimeOffset字段。 现在,我想从表中删除所有数据,其中DateTimeOffset字段包含的值大于我在C#应用程序中拥有的DateTime(UTC)对象,这样我就可以在以后插入新数据,而不必在表中重复数据。下面是一个我如何在C#中尝试这样做的示例:

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