【问题标题】:executing SELECT statement with date in WHERE clause fails在 WHERE 子句中执行带有日期的 SELECT 语句失败
【发布时间】:2010-09-10 03:37:33
【问题描述】:

我正在通过以下方式在我的 ASP.NET MVC 项目中构建动态查询:

Dim queryString As String = "SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos"
If strWhere <> "" Then
    queryString = queryString & " WHERE " & strWhere
End If

' Call the constructor with the specified query and the ObjectContext. 
Dim SearchUsersQuery As New System.Data.Objects.ObjectQuery(Of UserInformation)(queryString, MyDB)

Dim lstOfUsers As List(Of UserInformation) = SearchUsersQuery.ToList

基本上 strWhere 是一个字符串,我根据用户选择搜索的内容构建动态过滤器。

在我需要向 date 子句添加日期比较之前,这很有效。

我正在尝试以下方法:

strWhere = " userInfos.BirthDate <= " & StartDateForQuery.ToShortDateString

最终会变成:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos Where userInfos.BirthDate <= 10/09/1992"

但是,当我尝试使用 ToList 执行查询时,只要日期位于 where 字符串中,就会出现以下错误:

参数类型“Edm.DateTime”和“Edm.Int32”对于此操作不兼容。在 WHERE 谓词附近,第 1 行,第 103 列。

对我的问题有什么想法吗?

提前致谢

【问题讨论】:

  • 两个问题:什么是数据库供应商?数据库中 BirthDate 的格式是什么?
  • 这是一个 Microsoft SQL Server 数据库。 BirthDate 的类型为 DateTime
  • 你是如何执行这个查询的?
  • 将 SearchUsersQuery 作为新 System.Data.Objects.ObjectQuery(Of UserInformation)(queryString, MyDB) Dim lstOfUsers 作为 List(Of UserInformation) = SearchUsersQuery.ToList

标签: sql-server asp.net-mvc vb.net dynamic-sql


【解决方案1】:

你不能这样比较日期。

当你这样做时:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= 10/09/1992"

10/09/1992 被解释为 Int 值。

尝试在这个值周围加上单引号,如下所示:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= '10/09/1992'"

您可能必须调用一个数据库日期转换函数(取决于您的数据库供应商),将这个日期字符串传递给它。

像这样:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= DataBaseSpecificToDateFunction('10/09/1992')"

问题是这个查询被发送到数据库并且是执行它的数据库服务器。这就是为什么您需要一个特定于数据库的日期转换函数。

例如:在 Oracle 中,我们有 to_date 函数使用给定的模式将 string 转换为 datetime

to_date('1998/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam')

在 SQL Server 中,我们有 convert 函数,如下所示:

convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h)

更多示例here

【讨论】:

  • 我将其更改为:userInfos.BirthDate
  • 您是否尝试过仅在日期字符串周围使用单引号?
【解决方案2】:

你为什么不使用下一个代码:

Dim queryString As String = "SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos"
' Call the constructor with the specified query and the ObjectContext. 
'
Dim SearchUsersQuery As New System.Data.Objects.ObjectQuery(Of UserInformation)(queryString, MyDB)

'verify if should be a startdate for adding to query
'
If StartDateForQuery <> "" Then
 'add the condition to the query
    '

 SearchUsersQuery = SearchUsersQuery.Where("it.BirthDate  <= @BirthDate ")

 'add the parameter to be used
    '
 SearchUsersQuery.Parameters.Add(New ObjectParameter("BirthDate ", StartDateForQuery))
End If

Dim lstOfUsers As List(Of UserInformation) = SearchUsersQuery.ToList

您利用 linq 功能来生成查询(它“知道”如何为 DB 查询生成 datetime 参数)。

检查样本here

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2021-11-30
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多