在vb.net中如何实现用sql server语句查询某一时间段的数据

时间:2022-04-23 11:14:12
在vb.net中如何实现用sql server语句查询某一时间段的数据,我用的是datetimepick控件,如果忽略小时和分钟只按日期查询的话sql语句该怎么写?我捉摸了好几天都没结果,请高人赐教!

13 个解决方案

#1


首先你要学会在sqlserver中查询,也就是写sql语句,
然后你要学会怎么在vb.net中用vb构造一条你刚刚写的sql语句
最后你要学会怎么在vb.net中连上sqlserver并成功执行一条sql语句

#2


1楼所说的这些我都会啊,我提的问题用一般的数据查询方法没办法实现,因为牵涉到数据转换的问题,用存储过程和between语句都试过没用

#3


用2個datetimepick,一個起始時間一個截至時間,SQL語句裏面設置2個變量,我剛做過這個,好像沒有發生什麽問題。

SELECT ...
FROM   ...
WHERE (Date >= @Date1) AND (Date <= @Date2)
--或者WHERE (Date between @Date1 And @Date2)


Dim _Date1, _Date2 As String
_Date1 = dtp1.Text.ToString.Trim  'dtp1就是datetimepick1
_Date2 = dtp2.Text.ToString.Trim  'dtp2就是datetimepick2

Me.XXXTableAdapter.Fill(Me.YYYDataSet.XXX, _Date1, _Date2) 'XXX表名,YYY數據庫名
dgv.DataSource = Me.YYYDataSet.XXX

大致就這樣,樓主先做,哪裏有問題再提出來。你問得很籠統,我都不知道怎麽回答好。

#4


数据转换的问题
———————
什麽數據轉換?說清楚點。

#5


谢谢rockyvan的回答,我的情况是这样的,首先dpt1生成的时间不但有时间和日期还有小时和分,然后我在sql里设置相关字段的数据类型为datetime,但是我在查询的时候想只通过年月日的方式便可查到相关记录

用datetimepick控件添加日期和时间到数据库里的时候是带小时和分的,而用这个空间进行查询的时候生成的代码里只有年月日而没有具体时间,而我也希望只通过年月日来查询
如果按照你3楼写的代码_Date1 = dtp1.Text.ToString.Trim  查询的时候生成的字符是xx年xx月xx日,这样的话我执行select * from 表 where " & 开始时间 & "  and  " & 结束时间 & "会报错 错误提示"第 1 行: '年1月15日' 附近有语法错误"

我是用_Date1 = dtp1.value的方式来取值的,用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录

#6


谢谢rockyvan的回答,我的情况是这样的,首先dpt1生成的时间不但有时间和日期还有小时和分,然后我在sql里设置相关字段的数据类型为datetime,但是我在查询的时候想只通过年月日的方式便可查到相关记录 

用datetimepick控件添加日期和时间到数据库里的时候是带小时和分的,而用这个控件进行查询的时候生成的代码里只有年月日而没有具体时间,而我也希望只通过年月日来查询 
如果按照你3楼写的代码_Date1   =   dtp1.Text.ToString.Trim     查询的时候生成的字符是xx年xx月xx日,这样的话我执行select   *   from   表   where 时间 between  "   &   开始时间   &   "     and     "   &   结束时间   &   "由于中间含中文字符会报错   错误提示"第   1   行:   '年1月15日'   附近有语法错误" 

我是用_Date1   =   dtp1.value的方式来取值的,用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录


上一楼有写错纠正一下

#7


原來是時間格式化的問題。這個簡單。

我在sql里设置相关字段的数据类型为datetime
假如你數據庫的數據是這樣2008-02-02 08:59:56.483
那麽你程序裏面的數據也應該是這樣才對。不是的話用函數轉換一下。
例如:CONVERT(varchar(20), Date, 120)

_Date1 = dtp1.Text.ToString.Trim 
這個當然不能直接用,還是要格式化。

Private Sub dtp_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtp.ValueChanged
        dtp.Format = DateTimePickerFormat.Custom
        dtp.CustomFormat = "yyyy-MM-dd"   '""裏面就是你想格式化的形式
End Sub
  

用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录
因爲你數據庫裏面datetime包含日期和時間,你查詢條件裏面的日期對了時間對不上,所以沒有數據出來。
你說只按日期查詢就可以了,那麽可以考慮模糊查詢,用like。

--例如:
SELECT ...
FROM   ...
WHERE (CONVERT(varchar(7), Date, 120) LIKE @Date)
--或者WHERE (Date LIKE @Date)
--@Date=dtp1.Text.ToString.Trim  & "%"
--即:Date LIKE '2008-02-02%'

        


#8


建議:數據庫裏面把日期和時間字段分開,日期smalldatetime時間nvarchar。
需要用日期數據就找日期字段,需要時間數據就找時間字段。
純屬于個人建議,不一定適合你,反正我這樣用得還可以。

#9


是不是这个?
declare @tb table (id int,dt datetime)
insert into @tb select 1,'2008-01-01 09:33:19.043'
insert into @tb select 1,'2008-01-02 09:33:19.043'
insert into @tb select 1,'2008-01-03 09:33:19.043'

select * from @tb 
where dt between '2008-01-01'+' 00:00:00.000' and '2008-01-02'+' 23:59:59.999'


id dt
1 2008-01-01 09:33:19.043
1 2008-01-02 09:33:19.043

#10


用substring将日期参数分段,字符串操作转化为数据库日期格式,再用查询

#11


谢谢各位的建议,综合各位的建议我又重新试好几次,起初还是不行,又捉摸了半天结果发现问题出在了转义字符上,现在搞定了

#12


搞定就好!

#13


新年快樂!

#1


首先你要学会在sqlserver中查询,也就是写sql语句,
然后你要学会怎么在vb.net中用vb构造一条你刚刚写的sql语句
最后你要学会怎么在vb.net中连上sqlserver并成功执行一条sql语句

#2


1楼所说的这些我都会啊,我提的问题用一般的数据查询方法没办法实现,因为牵涉到数据转换的问题,用存储过程和between语句都试过没用

#3


用2個datetimepick,一個起始時間一個截至時間,SQL語句裏面設置2個變量,我剛做過這個,好像沒有發生什麽問題。

SELECT ...
FROM   ...
WHERE (Date >= @Date1) AND (Date <= @Date2)
--或者WHERE (Date between @Date1 And @Date2)


Dim _Date1, _Date2 As String
_Date1 = dtp1.Text.ToString.Trim  'dtp1就是datetimepick1
_Date2 = dtp2.Text.ToString.Trim  'dtp2就是datetimepick2

Me.XXXTableAdapter.Fill(Me.YYYDataSet.XXX, _Date1, _Date2) 'XXX表名,YYY數據庫名
dgv.DataSource = Me.YYYDataSet.XXX

大致就這樣,樓主先做,哪裏有問題再提出來。你問得很籠統,我都不知道怎麽回答好。

#4


数据转换的问题
———————
什麽數據轉換?說清楚點。

#5


谢谢rockyvan的回答,我的情况是这样的,首先dpt1生成的时间不但有时间和日期还有小时和分,然后我在sql里设置相关字段的数据类型为datetime,但是我在查询的时候想只通过年月日的方式便可查到相关记录

用datetimepick控件添加日期和时间到数据库里的时候是带小时和分的,而用这个空间进行查询的时候生成的代码里只有年月日而没有具体时间,而我也希望只通过年月日来查询
如果按照你3楼写的代码_Date1 = dtp1.Text.ToString.Trim  查询的时候生成的字符是xx年xx月xx日,这样的话我执行select * from 表 where " & 开始时间 & "  and  " & 结束时间 & "会报错 错误提示"第 1 行: '年1月15日' 附近有语法错误"

我是用_Date1 = dtp1.value的方式来取值的,用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录

#6


谢谢rockyvan的回答,我的情况是这样的,首先dpt1生成的时间不但有时间和日期还有小时和分,然后我在sql里设置相关字段的数据类型为datetime,但是我在查询的时候想只通过年月日的方式便可查到相关记录 

用datetimepick控件添加日期和时间到数据库里的时候是带小时和分的,而用这个控件进行查询的时候生成的代码里只有年月日而没有具体时间,而我也希望只通过年月日来查询 
如果按照你3楼写的代码_Date1   =   dtp1.Text.ToString.Trim     查询的时候生成的字符是xx年xx月xx日,这样的话我执行select   *   from   表   where 时间 between  "   &   开始时间   &   "     and     "   &   结束时间   &   "由于中间含中文字符会报错   错误提示"第   1   行:   '年1月15日'   附近有语法错误" 

我是用_Date1   =   dtp1.value的方式来取值的,用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录


上一楼有写错纠正一下

#7


原來是時間格式化的問題。這個簡單。

我在sql里设置相关字段的数据类型为datetime
假如你數據庫的數據是這樣2008-02-02 08:59:56.483
那麽你程序裏面的數據也應該是這樣才對。不是的話用函數轉換一下。
例如:CONVERT(varchar(20), Date, 120)

_Date1 = dtp1.Text.ToString.Trim 
這個當然不能直接用,還是要格式化。

Private Sub dtp_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtp.ValueChanged
        dtp.Format = DateTimePickerFormat.Custom
        dtp.CustomFormat = "yyyy-MM-dd"   '""裏面就是你想格式化的形式
End Sub
  

用这种方法取值的话会包含小时和分格式变为xx-xx-xx,语法是正确了没问题但只输入年月日的值得话查不出相关记录
因爲你數據庫裏面datetime包含日期和時間,你查詢條件裏面的日期對了時間對不上,所以沒有數據出來。
你說只按日期查詢就可以了,那麽可以考慮模糊查詢,用like。

--例如:
SELECT ...
FROM   ...
WHERE (CONVERT(varchar(7), Date, 120) LIKE @Date)
--或者WHERE (Date LIKE @Date)
--@Date=dtp1.Text.ToString.Trim  & "%"
--即:Date LIKE '2008-02-02%'

        


#8


建議:數據庫裏面把日期和時間字段分開,日期smalldatetime時間nvarchar。
需要用日期數據就找日期字段,需要時間數據就找時間字段。
純屬于個人建議,不一定適合你,反正我這樣用得還可以。

#9


是不是这个?
declare @tb table (id int,dt datetime)
insert into @tb select 1,'2008-01-01 09:33:19.043'
insert into @tb select 1,'2008-01-02 09:33:19.043'
insert into @tb select 1,'2008-01-03 09:33:19.043'

select * from @tb 
where dt between '2008-01-01'+' 00:00:00.000' and '2008-01-02'+' 23:59:59.999'


id dt
1 2008-01-01 09:33:19.043
1 2008-01-02 09:33:19.043

#10


用substring将日期参数分段,字符串操作转化为数据库日期格式,再用查询

#11


谢谢各位的建议,综合各位的建议我又重新试好几次,起初还是不行,又捉摸了半天结果发现问题出在了转义字符上,现在搞定了

#12


搞定就好!

#13


新年快樂!