我正在尝试创建一个Crystal Report,可以在其中搜索datetimepicker1和datetimepicker2选择的两个日期之间。 MySql数据库日期列已这样保存日期时间(12/26/2018 3:28:30 PM)。我的选择语句和参数不正确。我该怎么办?
Private Function GetData() As billing
Dim x = Form25.DateTimePicker1.Value.Date.ToString("MM-dd-yyyy")
Dim y = Form25.DateTimePicker2.Value.Date.ToString("MM-dd-yyyy")
Dim constr As String = ("server= PANKAJ\SQLEXPRESS; database = pankaj billing software; integrated security=True")
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand("select goldrate,date,itemcode,karat,category,item,qty,grossweight,netweight,discountrs,finalamount from allsaledata where date >= @date AND date <= @date", con)
cmd.Parameters.AddWithValue("@date", x And y)
Using sda As New SqlDataAdapter()
cmd.Connection = con
sda.SelectCommand = cmd
Using dsCustomers As New billing()
sda.Fill(dsCustomers, "DataTable1")
Return dsCustomers
End Using
End Using
End Using
End Using
End Function
答案 0 :(得分:3)
对日期类型的列执行查询时,要做的第一件事是不传递字符串类型的参数。这将迫使数据库引擎执行自己的转换,并且您有很高的风险获得错误的转换。
因此,您应该传递DateTime类型的参数,并且由于需要检查两个日期限制,因此需要两个参数
' Do not convert to strings here. Work with dates
Dim x = Form25.DateTimePicker1.Value.Date
Dim y = Form25.DateTimePicker2.Value.Date
Using cmd As New SqlCommand("select goldrate,date,itemcode,karat,
category,item,qty,grossweight,
netweight,discountrs, finalamount
from allsaledata
where date >= @init AND date <= @end", con)
cmd.Parameters.Add("@init", SqlDbType.Date).Value = x
cmd.Parameters.Add("@end", SqlDbType.Date).Value = y
要注意的另一件事是,如果使用不带“时间”部分的DateTime,则查询可能会排除最后一天的日期。
例如,如果结束日期为02/05/2019 00:00:00,则日期和时间为02/05/2019 19:40:00的记录将不包括在结果中因为00:00:000的时间是午夜,而其他时间都是在午夜之后。
如果您想避免这种情况,请在结束日期前加上一天,例如
Dim y = Form25.DateTimePicker2.Value.Date.AddDay(1)