关于VB2010中Dateview.RowFilter中筛选日期时间数据

haidaoyihaoerhao 2015-07-21 12:35:12
关于VB2010中Dateview.RowFilter中筛选日期时间数据
我用的VB2010,做的读取Excel表格后加载到DateView,用DateGridView显示,以日期为条件,筛选数据,
用的2个DateTimePicker获得查询的 开始时间和截止时间,DateTImePicker的日期截短后分别赋值给StrFilterDateStart和strFilterDateEnd(值为:Year-mouth-Day格式)
关键代码如下:
objDataView.RowFilter = "F7 >='" + strFilterDateStart + " 00:00:00'" + " AND F7 <='" + strFilterDateEnd + " 23:59:59'"
(F7是时间列,strFilterDateStart、strFilterDdateEnd是日期(如2015-7-1))
Excel中日期列的数据格式如下
Year-Month-Day HH:mm:ss
问题出来了:
晚上0点的时候可以正常筛选数据,如我选择开始日期和截止日期都是7月1号,即筛选7月1号1天内的数据,可以正常工作。
但第二天早上在试的时候,选择7月1号内的数据,DateGridView中无数据显示,DateView.RowCount=0.
但是选择7月1号到2号的数据DateGridView中有数据,该数据却是我0点时候筛选的仅1号1天内的数据


哪位大神可以指导下?我这是什么问题?怎么解决
...全文
652 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-07-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 haidaoyihaoerhao 的回复:]他们的值 我调试 看了 都是正确的选择的筛选日期值,如2015-07-06 [/Quote]
[Quote=引用 13 楼 Tiger_Zhao 的回复:]不信。[/Quote]
Tiger_Zhao 2015-07-24
  • 打赏
  • 举报
回复
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
objDataView.RowFilter = "F7 LIKE '2015-07-22*'"
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
objDataView.RowFilter = "F7 >= '2015-07-22' AND F7 < '2015-07-24'"
End Sub

我这里用你#3的代码试了一下没问题。
如果 objDataView.Table.Columns("F7").DataType 是 DateTime 类型,Button1 的 Like 方式不能用,Button2正确。
如果是 String 类型,Button1和Button2都正确。

A)你的数据有问题,请把 objDataView.Table 的 F7 列用 Debug.Print 打印出来。你是不是显示的 DataGridView 又设了显示格式了?
B)还是怀疑 strFilterDateStart、strFilterDateEnd 有问题。
haidaoyihaoerhao 2015-07-24
  • 打赏
  • 举报
回复
我的问题解决了.
具体如下:
在代码
objDataView.RowFilter = "F7 >='" + strFilterDateStart + " 00:00:00'" + " AND F7 <='" + strFilterDateEnd + " 23:59:59'"
的 (一下”_“代表一个空格)strFilterDateStart + " __00:00:00'"和strFilterDateEnd + "__ 23:59:59'"中多了两个空格,不是我犯低水平错误,而是用以上代码写的时候是一个空格,可是编译的时候确实2个空格,导致出现如题所述的问题,至少我这里是这样的。
后面我用下面的代码解决的筛选:
objDataView.RowFilter = String.Format("F7 >= '{0}00:00:00' and F7 <= '{1}23:59:59'", strFilterDateStart, strFilterDateEnd)
这段代码:{0}_00:00:00' and F7 <= '{1}_23:59:59可以做到编译时只有一个空格,至少在编译后调试里是这样。
一下是截图,

截图里看的空格位置看的跟没有一样,但是确实有个空格
haidaoyihaoerhao 2015-07-24
  • 打赏
  • 举报
回复
引用 18 楼 Tiger_Zhao 的回复:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        objDataView.RowFilter = "F7 LIKE '2015-07-22*'"
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        objDataView.RowFilter = "F7 >= '2015-07-22' AND F7 < '2015-07-24'"
    End Sub
我这里用你#3的代码试了一下没问题。 如果 objDataView.Table.Columns("F7").DataType 是 DateTime 类型,Button1 的 Like 方式不能用,Button2正确。 如果是 String 类型,Button1和Button2都正确。 A)你的数据有问题,请把 objDataView.Table 的 F7 列用 Debug.Print 打印出来。你是不是显示的 DataGridView 又设了显示格式了? B)还是怀疑 strFilterDateStart、strFilterDateEnd 有问题。
strFilterDateStart 、strFilterDateEnd 都没有问题,上面的调试截图里可以看出
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
还有你的strFilterDateStart、strFilterDateEnd 怎么声明、怎么赋值、当前值是什么? 看你#8的图怎么没赋值直接用了!
strFilterDateStart、strFilterDateEnd 都是用str开头,说明是String类型,是全局变量 ,最前面就定义了 他们的值 我调试 看了 都是正确的选择的筛选日期值,如2015-07-06
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
字符串类型试试
objDataView.RowFilter = "F7 LIKE '2015-07-22*'"
这样不行 吧 。 这样的话只能选取一天内的数据
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
还有你的strFilterDateStart、strFilterDateEnd 怎么声明、怎么赋值、当前值是什么?
看你#8的图怎么没赋值直接用了!
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
字符串类型试试
objDataView.RowFilter = "F7 LIKE '2015-07-22*'"
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
"SELECT * FROM [Sheet1$] WHERE F7 >= #" & Format(DateTimePicker1.Value, "yyyy-mm-dd") & "# AND F7 < #" & Format(DateTimePicker1.Value + 1, "yyyy-mm-dd") & "#"

不用带钟点,小于截至日加一天即可。


你的方法我试了;
不行,会出现以上错误。
我把DateTimerpicker1.Value改成了我的strFilterDateStart和strFilterDateEnd

也不行,出现提示语法错误:“[Sheet1$]”运算符后缺少操作数
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 6 楼 Tiger_Zhao 的回复:
objDataView.Table.Columns("F7").DataType 是什么?
还有你控制面板区域和语言选项中是中文吗(日期格式yyyy-mm-dd)?




objDataView.Table.Columns("F7").DataType是String类型的

控制面板和语言选项中长/短日期格式都是yyyy-mm-dd
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
objDataView.Table.Columns("F7").DataType 是什么?
还有你控制面板区域和语言选项中是中文吗(日期格式yyyy-mm-dd)?
of123 2015-07-23
  • 打赏
  • 举报
回复
"SELECT * FROM [Sheet1$] WHERE F7 >= #" & Format(DateTimePicker1.Value, "yyyy-mm-dd") & "# AND F7 < #" & Format(DateTimePicker1.Value + 1, "yyyy-mm-dd") & "#" 不用带钟点,小于截至日加一天即可。
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 15 楼 haidaoyihaoerhao 的回复:
[quote=引用 13 楼 Tiger_Zhao 的回复:] 先确认能否选一天的数据。 不信。
对不起啦,我没说清楚。 我说的不行 是指 不能够实现我要的功能,即能实现筛选指定日期内(多天或一天)的数据,是有日期段的(例如3号 到 5号) 不是说只实现筛选一天的数据。[/quote] 我想向您请教下: 如何用DataView.RowFilter 筛选 数据类型为String的日期时间数据(例如2015-02-06 23:42:36),实现筛选某个日期段内的数据? 不知道您有没有更好的方法。 或者有其他的方式实现
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 14 楼 of123 的回复:
[quote=引用 8 楼 haidaoyihaoerhao 的回复:] [quote=引用 5 楼 of123 的回复:] "SELECT * FROM [Sheet1$] WHERE F7 >= #" & Format(DateTimePicker1.Value, "yyyy-mm-dd") & "# AND F7 < #" & Format(DateTimePicker1.Value + 1, "yyyy-mm-dd") & "#" 不用带钟点,小于截至日加一天即可。
你的方法我试了; 不行,会出现以上错误。 我把DateTimerpicker1.Value改成了我的strFilterDateStart和strFilterDateEnd 也不行,出现提示语法错误:“[Sheet1$]”运算符后缺少操作数[/quote] 不要照抄我的 SQL 例子。你原来怎样查询的,照原来的写,后面的 Where 语句供参考。 另外,你的 strFilterDateStart 内容是什么?无法确定格式是否正确。[/quote] 没有照抄你的例子, 你的DateTimePicker1.Value 都改成我自己的DateTImePicker了 如何Where语句仅供参考,那我就不会Where语句了。你的Where语句后面 我只是按我自己的程序改编的 StrFilterDateStart中的内容是yyyy-mm-dd内容。
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 13 楼 Tiger_Zhao 的回复:
先确认能否选一天的数据。 不信。
对不起啦,我没说清楚。 我说的不行 是指 不能够实现我要的功能,即能实现筛选指定日期内(多天或一天)的数据,是有日期段的(例如3号 到 5号) 不是说只实现筛选一天的数据。
of123 2015-07-23
  • 打赏
  • 举报
回复
引用 8 楼 haidaoyihaoerhao 的回复:
[quote=引用 5 楼 of123 的回复:] "SELECT * FROM [Sheet1$] WHERE F7 >= #" & Format(DateTimePicker1.Value, "yyyy-mm-dd") & "# AND F7 < #" & Format(DateTimePicker1.Value + 1, "yyyy-mm-dd") & "#" 不用带钟点,小于截至日加一天即可。
你的方法我试了; 不行,会出现以上错误。 我把DateTimerpicker1.Value改成了我的strFilterDateStart和strFilterDateEnd 也不行,出现提示语法错误:“[Sheet1$]”运算符后缺少操作数[/quote] 不要照抄我的 SQL 例子。你原来怎样查询的,照原来的写,后面的 Where 语句供参考。 另外,你的 strFilterDateStart 内容是什么?无法确定格式是否正确。
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 2 楼 of123 的回复:
你不妨将 Excel 作为外部数据库来访问,查询的时候就加上 Where 子句进行条件筛选。得到的记录集直接显示就好了。
我用的就是外部数据库访问的方式读取Excel的 请问 objDataView.RowFilter = "F7 >='" + strFilterDateStart + " 00:00:00'" + " AND F7 <='" + strFilterDateEnd + " 23:59:59'" 这句话如何翻译成Where语句。 对不起,我数据库不会
haidaoyihaoerhao 2015-07-23
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
你怎么“读取Excel表格后加载到DateView”的? Excel 的格式只是显示格式,和读取的数据类型没有直接关系。 如果读取的是字符串值,你的“Year-mouth-Day格式”中年月日的位数是否一致? 如果读取的是日期值,RowFilter 中日期值两边用 # 试试。 还有你的数据明细有问题啊,同样的 RowFilter 条件怎么会受当前时间的影响,数据是动态变化的?
我是按读取数据库的方式读取excel表格的,excel表格中的日期时间列是:2015-07-23 00:52:31这样格式的,读取后在DateGridView中相关列显示的也是2015-07-23 00:52:31,这在DateGridView列中应该算是String类型吧。所以采用的 objDataView.RowFilter = "F7 >='" + strFilterDateStart + " 00:00:00'" + " AND F7 <='" + strFilterDateEnd + " 23:59:59'" 对数据进行帅选。筛选结果是这样的: 一天内的数据,DataGridView中无数据显示,如2015-07-22 00:00:00到2015-07-22 23:59:59内(一天)无数据显示 筛选多天内的数据,DataGridView中会有开始日期到截止日期前一天的数据,却没有截止日期当天的数据。 如筛选日期2015-07-22 00:00:00到2015-07-23 23:59:59内的数据, DataGridView中仅有2017-07-22号内的数据,并无2015-07-23内的数据 然后我用RowFilter 中日期值两边用 #试过,不行,必进列中日期时间数据是String 读取Excel表格的代码如下: If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then Try Dim FileName As String = OpenFileDialog.FileName ' TODO: 在此处添加打开文件的代码。 Dim strCnn As String SetNothing() objDataSet = New Data.DataSet() strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + FileName + "';Extended Properties='Excel 12.0;HDR=YES;IMEX=1'" objCnn = New System.Data.OleDb.OleDbConnection(strCnn) 'repot_list是excel的表名 Dim strSQL As String = "Select * From [repot_list$]" objCnn.Open() objDataAdapter = New System.Data.OleDb.OleDbDataAdapter(strSQL, objCnn) objDataSet = New DataSet() objDataAdapter.Fill(objDataSet, "sheet1") objDataView = New DataView(objDataSet.Tables("sheet1")) objDataView.AllowNew = False objDataView.AllowEdit = False objDataView.AllowDelete = False grdExcel.Dock = DockStyle.Fill grdExcel.AutoGenerateColumns = True grdExcel.DataSource = objDataView Catch ex As Exception MessageBox.Show(ex.Message) End Try End If 以上代码可以正确读取excel表格,并加载到DateView,然后DataGridView中会显示excel中的数据
Tiger_Zhao 2015-07-23
  • 打赏
  • 举报
回复
先确认能否选一天的数据。
不信。
of123 2015-07-22
  • 打赏
  • 举报
回复
你不妨将 Excel 作为外部数据库来访问,查询的时候就加上 Where 子句进行条件筛选。得到的记录集直接显示就好了。
加载更多回复(1)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧