VB.net SQL日期选择器从下拉列表中选择日期,但手动指定时间

VB.net SQL日期选择器从下拉列表中选择日期,但手动指定时间,sql,vb.net,datetime,Sql,Vb.net,Datetime,我有两个datefield下拉列表,最终用户将从中选择开始日期和结束日期。但是,当我运行查询时,我丢失了第一个日期,也就是说,我选择了第9-15个日期,但是我得到了第10-15个记录 我的想法是以某种方式从下拉菜单中获取当天,并手动硬编码开始和结束时间(00:00:00和24:00:00) 我想我可能可以做类似的事情,但我的代码不起作用 Private Sub FindItem2() SQL2.AddParam("@datestart", dateStart.Value.ToShortD

我有两个datefield下拉列表,最终用户将从中选择开始日期和结束日期。但是,当我运行查询时,我丢失了第一个日期,也就是说,我选择了第9-15个日期,但是我得到了第10-15个记录

我的想法是以某种方式从下拉菜单中获取当天,并手动硬编码开始和结束时间(00:00:00和24:00:00)

我想我可能可以做类似的事情,但我的代码不起作用

Private Sub FindItem2()
    SQL2.AddParam("@datestart", dateStart.Value.ToShortDateString + '00:00:00')
    SQL2.AddParam("@dateend", dateEnd.Value.ToShortDateString + '24:00:00')
    LoadGrid("SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), LEN(CustomerNumber)),'D','CAFET','', sum(Total) as totalsales FROM ViewDetailedSalesReport WHERE CustomerNumber is not null AND DateSold BETWEEN (@datestart) AND (@dateend) GROUP BY CustomerNumber, CustomerLastName ORDER BY CustomerLastName ASC; ")
End Sub
编辑新内容:

我删除了我的代码,而不是试图修改它。我使用了Cetin的代码,并通过将变量移到顶部、删除标记以及在查询周围添加引号对其进行了调整。在那之后,它工作了,而且完全是它应该工作的

Private Sub FindItem2()
    SQL2.AddParam("@datestart", dateStart2.Value.Date)
    SQL2.AddParam("@dateend", dateEnd2.Value.Date.AddDays(1))
    Dim cmd As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), 
    LEN(CustomerNumber)),
    'D','CAFET','', 
    sum(Total) as totalsales 
  FROM ViewDetailedSalesReport 
  WHERE CustomerNumber is not null AND 
        DateSold >= @datestart AND DateSold <@dateend
  GROUP BY CustomerNumber, CustomerLastName 
  ORDER BY CustomerLastName ASC;"
    LoadGrid(cmd)
End Sub
Private子FindItem2()
SQL2.AddParam(“@datestart”,dateStart2.Value.Date)
SQL2.AddParam(“@dateend”,dateEnd2.Value.Date.AddDays(1))
Dim cmd As String=“选择子字符串(CustomerNumber,PATINDEX('%[^0]]',CustomerNumber+”),
LEN(客户编号)),
‘D’、‘CAFET’、’,
总额(合计)为总销售额
从ViewDetailedSalesReport
其中CustomerNumber不为null,并且
DateSeld>=@datestart和DateSeld=DateAdd(天,-1,@datestart)和DateSeld<(@dateend)按客户编号分组,按客户名称ASC;)排序)
端接头
我按照Cetin的建议,使用>=和<,而不是介于两者之间,修改了该部分,并使用DateAdd将dayoffset更改为-1

DateSold >= DateAdd(day,-1,@datestart) AND DateSold < (@dateend)
datesell>=DateAdd(day,-1,@datestart)和datesell<(@dateend)

尝试将日期时间值转换为字符串并在MS SQL Server中使用Between检查日期时间范围时出错。这就像说x>=y和x=y和x loadgrid类似于dataTable.Load(sqlCommand.ExecuteReader)

编辑:不确定那些SQL2.AddParam和LoadGrid是什么。以下是一个示例:

Dim sql As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), 
LEN(CustomerNumber)),
'D','CAFET','', 
sum(Total) as totalsales 
FROM ViewDetailedSalesReport 
WHERE CustomerNumber is not null AND 
    DateSold >= @datestart AND DateSold <@dateend
GROUP BY CustomerNumber, CustomerLastName 
ORDER BY CustomerLastName ASC;"

Dim tbl As DataTable = New DataTable()

Using cn As SqlConnection = New SqlConnection("server=.\SQLExpress;Database=YourDb;Trusted_Connection=yes")
    Using cmd As SqlCommand = New SqlCommand(sql, cn)
        cmd.Parameters.Add("@datestart", SqlDbType.Date).Value = dateStart.Value.Date
        cmd.Parameters.Add("@dateend", SqlDbType.Date).Value = dateEnd.Value.Date.AddDays(1)
        cn.Open()
        tbl.Load(cmd.ExecuteReader())
        cn.Close()
    End Using
End Using

' Do whatever with datatable
Dim sql As String=“选择子字符串(CustomerNumber,PATINDEX(“%[^0]]”,CustomerNumber+”),
LEN(客户编号)),
‘D’、‘CAFET’、’,
总额(合计)为总销售额
从ViewDetailedSalesReport
其中CustomerNumber不为null,并且

DateSeld>=@datestart和DateSeld这是一个错误,尝试将DateTime值转换为字符串,并在MS SQL Server中使用Between.Between检查DateTime范围,就像说x>=y和x=y和x loadgrid类似于dataTable.Load(sqlCommand.ExecuteReader)

编辑:不确定那些SQL2.AddParam和LoadGrid是什么。下面是一个示例:

Dim sql As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), 
LEN(CustomerNumber)),
'D','CAFET','', 
sum(Total) as totalsales 
FROM ViewDetailedSalesReport 
WHERE CustomerNumber is not null AND 
    DateSold >= @datestart AND DateSold <@dateend
GROUP BY CustomerNumber, CustomerLastName 
ORDER BY CustomerLastName ASC;"

Dim tbl As DataTable = New DataTable()

Using cn As SqlConnection = New SqlConnection("server=.\SQLExpress;Database=YourDb;Trusted_Connection=yes")
    Using cmd As SqlCommand = New SqlCommand(sql, cn)
        cmd.Parameters.Add("@datestart", SqlDbType.Date).Value = dateStart.Value.Date
        cmd.Parameters.Add("@dateend", SqlDbType.Date).Value = dateEnd.Value.Date.AddDays(1)
        cn.Open()
        tbl.Load(cmd.ExecuteReader())
        cn.Close()
    End Using
End Using

' Do whatever with datatable
Dim sql As String=“选择子字符串(CustomerNumber,PATINDEX(“%[^0]]”,CustomerNumber+”),
LEN(客户编号)),
‘D’、‘CAFET’、’,
总额(合计)为总销售额
从ViewDetailedSalesReport
其中CustomerNumber不为null,并且

DateSeld>=@datestart和DateSeld感谢您的回复!我接受了你的代码,它确实运行了,但我现在得到了双日补偿。我错过了第一天,似乎第二天就要结束了,现在我又多了一天。i、 e-5-10的成绩是第6-11名。有什么想法吗?AddParam只是编写SQL查询的一种保护措施。我没有将直接值传递到SQL查询中,而是首先设置一个参数并将其传递到查询中。是的,负载网格只是将我的查询显示在一个数据表中。我用一个“解决方案”更新了我的OP,尽管我不确定它的最佳实践是否像我这样做。我仍然不确定时间是如何通过日期和时间选择器确定的,因为唯一显示的是天,而不是时间。@Tohny.Johnson,我不明白你说的5-10是指第6-11。如果选择的日期是2020年1月1日和2020年1月31日(无论时间部分是什么),代码将提取整个2020年1月数据。我想知道您的SQL2.AddParam是否有问题。为什么不直接使用cmd.Parameters.Add()。谢谢您的回复!我接受了你的代码,它确实运行了,但我现在得到了双日补偿。我错过了第一天,似乎第二天就要结束了,现在我又多了一天。i、 e-5-10的成绩是第6-11名。有什么想法吗?AddParam只是编写SQL查询的一种保护措施。我没有将直接值传递到SQL查询中,而是首先设置一个参数并将其传递到查询中。是的,负载网格只是将我的查询显示在一个数据表中。我用一个“解决方案”更新了我的OP,尽管我不确定它的最佳实践是否像我这样做。我仍然不确定时间是如何通过日期和时间选择器确定的,因为唯一显示的是天,而不是时间。@Tohny.Johnson,我不明白你说的5-10是指第6-11。如果选择的日期是2020年1月1日和2020年1月31日(无论时间部分是什么),代码将提取整个2020年1月数据。我想知道您的SQL2.AddParam是否有问题。为什么不简单地使用cmd.Parameters.Add()。24小时时钟从不读“24:00:00”,因为这与“00:00:00”相同。您可能想使用“23:59:59”作为“结束时间”。您的修改与我的不匹配。请将时间部分全部删除,不要转换为字符串。只需将参数添加为日期时间值(其中使用dtPicker.Value.Date删除时间部分。什么数据类型是
ViewDetailedSalesReport.DateSeld
?如果是
DATETIME
,表中的值是否实际有时间,或者时间是否都为零?同样的问题适用于脚本中的
datestart
dateend
变量。它们是de>日期
日期时间
s或
日期时间
s,时间为零?@digital.aaron-它们是没有时间的日期。它们在原始导出中显示为YYYYMMDD。@Cetin Bosoz-完全删除了我的代码,并修改了您的代码以在环境中工作。我使其正常工作。我再次编辑了OP以反映更改。我我就是不明白为什么我的原始代码会剪切o
sqlCommand.Parameters.Add("@dateStart", SqlDbType.Date).Value = dateStart.Value.Date
Dim sql As String = "SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), 
LEN(CustomerNumber)),
'D','CAFET','', 
sum(Total) as totalsales 
FROM ViewDetailedSalesReport 
WHERE CustomerNumber is not null AND 
    DateSold >= @datestart AND DateSold <@dateend
GROUP BY CustomerNumber, CustomerLastName 
ORDER BY CustomerLastName ASC;"

Dim tbl As DataTable = New DataTable()

Using cn As SqlConnection = New SqlConnection("server=.\SQLExpress;Database=YourDb;Trusted_Connection=yes")
    Using cmd As SqlCommand = New SqlCommand(sql, cn)
        cmd.Parameters.Add("@datestart", SqlDbType.Date).Value = dateStart.Value.Date
        cmd.Parameters.Add("@dateend", SqlDbType.Date).Value = dateEnd.Value.Date.AddDays(1)
        cn.Open()
        tbl.Load(cmd.ExecuteReader())
        cn.Close()
    End Using
End Using

' Do whatever with datatable