【问题标题】:Convert string to SQL Server DateTime which should be in "yyyy-MM-dd hh:mm:ss" format将字符串转换为 SQL Server DateTime,其格式应为“yyyy-MM-dd hh:mm:ss”
【发布时间】:2015-08-11 07:27:12
【问题描述】:

C# 的DateTimedd.MM.yyyy hh:mm:ss 格式,因此它与SQL Server 使用的不兼容。我希望它采用yyyy-MM-dd hh:mm:ss 格式。有谁知道我该怎么做?

DateTime odt = new DateTime(year, month, day, hour, minute, second);
string odt2= odt.ToString("yyyy-MM-dd hh:mm:ss");

这是我正在使用的存储过程;

ALTER PROCEDURE [dbo].[SELECT_ORDERSTATUS_BY_ORDERDATETIME]
    @ORDERDATETIME DateTime
AS
    SELECT dbo.OrderTable.Status
    FROM dbo.OrderTable
    WHERE OrderDateTime = @ORDERDATETIME

这是我的 C# 代码。 ExecuteScalar 返回空值,我认为这是因为 DateTime 根本不匹配。

DateTime odt = new DateTime(year, month, day, hour, minute, second);

SqlConnection con = generateConnectionString();
con.Open();

SqlCommand command = generateCommand("SELECT_ORDERSTATUS_BY_ORDERDATETIME", con);

SqlParameter paramOrderDateTime = new SqlParameter("@ORDERDATETIME", odt);
command.Parameters.Add(paramOrderDateTime);

string status = (string)command.ExecuteScalar();
currentstatusTextbox.Text = status;
con.Close();

【问题讨论】:

  • ADO.NET 完全了解 .NET 的 DateTime 和 SQL Server 的 datetime 数据类型如何工作以及如何在它们之间进行转换。它们都没有格式。您看到的是当这些类型转换为 strings 时会发生什么。避免这些转换并使用 ADO.Net 中的内置支持在它们之间进行转换。
  • 日期,在 SQL Server 或 C# 中没有格式,它们是二进制值。如果您在表中使用日期类型的字段并将日期类型的参数传递给参数化查询,那么您将没有问题。如果你这样做,那是因为你自己的代码强制转换为字符串。请贴出相关代码
  • 请发布产生问题的查询。否则只能猜测您正在使用字符串连接而不是参数化查询并将日期转换为任意字符串而不是将它们作为参数传递,甚至作为可识别的日期文字
  • 如果您的调用没有返回数据,那是因为 没有 没有具有确切日期时间值的数据(一直到第二个)。尝试使用完全相同的日期时间执行该过程,以查看是否返回任何数据

标签: c# sql-server visual-studio datetime format


【解决方案1】:

SQL Server 将 DateTime 值保存为二进制文件。它没有任何格式的概念。您看到的只是它们在 SSMS 或查询窗口中的文本表示。

如果您使用datetimedatetime2 作为列类型,则可以直接parameterized queries 中使用您的odt 值。

在你的edit之后:

据我所知,您没有将CommandType 设置为StoredProcedure。如果您的 Status 列是用字符串映射的,并且所有其他事情都正常,这应该可以;

using(SqlConnection con = generateConnectionString())
using(var command = con.CreateCommand())
{
    command.CommandText = "SELECT_ORDERSTATUS_BY_ORDERDATETIME";
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@ORDERDATETIME", SqlDbType.DateTime).Value = odt;

    con.Open();
    string status = (string)command.ExecuteScalar();
}

【讨论】:

  • @g.pickardou 不,它没有。您将连接级语言显示格式误认为是实际数据类型格式。如果需要,您可以查看各种日期时间类型的文档以了解确切的位布局。参数化查询不涉及智能层 - 这与使用带有日期类型参数的存储过程或函数相同。参数值作为二进制文件传递
  • @g.pickardou 我不明白你说的 inappropriate 是什么意思。 datedatetimedatetime2 在 CLR 端映射为 DateTime。例如,您所说的 format 可以在查询窗口中使用,因为您不能将它们作为二进制文件插入。例如,当您尝试说 Insert into ... values ('2004-05-23T14:25:10') 时。当您尝试使用 datetimedatetime2 作为 字符串文字 时,这些是正确的格式。
  • @SonerGönül 许多人将日期格式选项或排序规则的日期格式与实际的日期类型格式混淆。
  • @g.pickardou - 一旦某些数据被转换为datetime 值,就不会存储有关如何构造该值的信息。这就是人们将类型描述为没有格式时的意思 - 无法获取该类型的值并要求它转换回用于生成它的相同字符串。
  • @g.pickardou - 文字的存在不会改变数据类型的性质 - 或者如果改变了,你如何解释 VB.Net 确实 有一个日期时间文字,但 C# 和 VB.Net 在 .NET 中使用完全相同的 DateTime 类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2014-04-24
相关资源
最近更新 更多