在WHERE子句中执行带有日期的SELECT语句失败

时间:2010-09-10 03:37:33

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

我正在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列。

关于我的问题是什么想法?

提前致谢

2 个答案:

答案 0 :(得分: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 函数将字符串转换为使用给定模式的日期时间

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

答案 1 :(得分:0)

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

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功能生成查询(它“知道”如何为数据库查询生成datetime参数)。

检查样本here