【问题标题】:How to pass a parameter to an SQL script to change argument 2 of DATEADD() in VB.net?如何将参数传递给 SQL 脚本以更改 VB.net 中 DATEADD() 的参数 2?
【发布时间】:2015-06-06 03:21:45
【问题描述】:

我正在尝试将参数从下拉框中发送到 SQL 服务器脚本,该脚本将更改 DATEADD() 的参数 2:

SELECT DISTINCT Orders.Order_ID, Customers.First_Name, Orders.Order_Date, Payment_Details.Card_Name, Payment_Details.Card_Type, Payment_Details.Customer_ID
FROM            Orders INNER JOIN
                         Customers ON Orders.Customer_ID = Customers.Customer_ID INNER JOIN
                         Payment_Details ON Orders.Payment_ID = Payment_Details.Payment_ID
WHERE        (Orders.Order_Date < CONVERT(Varchar(20), DATEADD(d, CONVERT(dec, @DATE), { fn CURDATE() })));  

然后这将使用结果填充网格视图:

Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
        Dim OrderHistorySearch As New Allin1IDTableAdapters.OrdersTableAdapter
        GridView1.DataSource = OrderHistorySearch.GetDataByOrderHistory(Me.DropDownList1.Text)
        GridView1.DataBind()
    End Sub
End Class

但是我收到一条错误消息:

将参数值从字符串转换为日期时间失败。

字符串未被识别为有效的日期时间。

但是,在使用 SQL Server 向导时,查询完全正常。

我尝试转换数据类型,但似乎没有任何效果。

我该如何解决我的问题?

【问题讨论】:

  • 您是在代码中构建 SQL 语句还是直接从 sql-server 运行的 SQL 语句?
  • 您将什么字符串传递给 DATE 参数? { fn CURDATE() } 应该是什么?
  • SQL 语句直接从 sql-server 工作。
  • 传递的字符串是 1,2,3,5,10,15。取决于在下拉列表中选择的选项。 CURDATE 是从 SQL 服务器向导自动添加“{fn}”的当前日期。

标签: sql-server vb.net visual-studio-2010 dateadd


【解决方案1】:

我看到两个问题,让我先解决非关键问题:

  1. DATEADD() 的第二个参数应该是一个整数。

首先,为什么不是小数?尝试从当前日期减去半天(或小时、分钟等),SQL Server 不会减去 12 小时,它只会将其四舍五入为 0 并返回当前日期。所以没有理由接受非整数;让选项保持打开状态只会导致错误。

其次,如果您已将@DATE 参数声明为整数类型,则根本不需要CONVERT() - 您只需确保您的代码将整数提供给SQL 查询。顺便说一句,我会把它称为不那么容易引起误解的东西,比如@NUMBER_OF_DAYS

  1. { fn CURDATE() }ODBC function call

获取当前日期的 SQL Server 函数不是CURDATE(),实际上是GETDATE()。向导建议的表达式旨在使代码更具可移植性,使其可以在其他没有GETDATE() 的 SQL 平台上运行,例如 MySQL。

然而,这个函数调用有更大的问题,比如本地化。例如,在我的系统上,它使用欧洲本地化,调用 DATEADD(day, 1, { fn CURDATE() }) 错误并添加 month 到今天,因为它错误地将其视为美国日期。但是如果我打电话给DATEADD(day, 1, CONVERT(DATE, { fn curdate() })),我会得到正确的结果,即明天。

我怀疑正在发生的事情是,在您的本地化/配置中,{ fn CURDATE()} 返回的内容根本不会被解析为有效日期。如果不关心可移植性,最好将函数调用替换为简单的GETDATE()。在任何情况下,请尝试在您的服务器上SELECTing 以下表达式并查看每个表达式的结果:

{ fn curdate() } 
CONVERT(DATE, { fn curdate() })
DATEADD(day, 1, { fn curdate() })
DATEADD(day, 1, CONVERT(DATE, { fn curdate() }))
GETDATE()
DATEADD(day, 1, GETDATE())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多