【问题标题】:Conversion failed when converting date and/or time from character string C# application从字符串 C# 应用程序转换日期和/或时间时转换失败
【发布时间】:2018-12-25 17:01:29
【问题描述】:

我正在尝试返回生日在当前日期的数据库记录。我目前遇到了转换错误。

这是代码,我在我的数据库中使用 varchar 表示 DOB。请我需要帮助。

string query = @"SELECT Names, FamilyName, PhoneNo, gender, DOB, Email 
FROM Members 
WHERE month(Members.DOB) = month(getdate()) 
  AND day(Members.DOB) = day(getdate())";

我得到这个错误:

System.Data.SqlClient.SqlException: '转换时转换失败 字符串中的日期和/或时间。

【问题讨论】:

  • 相同的查询是否适用于 SSMS 之类的东西?当有多种日期/时间类型可供选择时,为什么要使用 varchar 作为日期?
  • 我投了反对票,因为没有努力正确地提出问题。
  • “我在向我的表中插入数据时会遇到问题”?然后你将数据错误地插入到你的表中。将日期存储为字符串会在整个应用程序中造成二次损坏。你必须停止这样做。
  • 我想我会改变我数据库中的数据类型

标签: c# sql type-conversion


【解决方案1】:

您必须将 Members.DOB 格式化为 DateTime,例如:

Cast(Members.DOB as DateTime)

所以完整的表达式是:

Where month(Cast(Members.DOB as DateTime)) = ...

【讨论】:

    【解决方案2】:

    例外是因为您尝试为 varchar 数据类型列 Members.DOB 调用 MonthYEAR 函数。您应该在where 子句中将此列值转换为datetime -

    string query = @"SELECT Names, FamilyName, PhoneNo, gender, DOB, Email 
    FROM Members 
    WHERE month(convert(datetime,Members.DOB,105)) = month(getdate()) 
      AND day(convert(datetime,Members.DOB,105)) = day(getdate())";
    

    在上面的转换中,第三个参数105是DOB列日期值的格式,样式码105代表dd-mm-yyyy的格式,你可以找到更多的样式码here

    【讨论】:

    • 当我尝试这个时,它给出了一个错误:将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值
    • 在 DOB 列中分享示例日期值
    • birthday = (metroComboBoxday.SelectedIndex + 1) + "-" + (metroComboBoxmonth.SelectedItem) + "-" + txtyear.Text; 这就是我生日的方式,这就是我使用字符串作为数据类型的原因。相同的数据值1980-05-01
    • 现在尝试使用样式代码 105 的更新查询。您可以从我分享的链接中尝试不同的样式代码
    猜你喜欢
    • 2012-01-13
    • 2012-04-17
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多