【问题标题】:VB.net SQL Datepicker select date from dropdown but manually specify timeVB.net SQL Datepicker 从下拉列表中选择日期,但手动指定时间
【发布时间】:2020-02-24 23:27:46
【问题描述】:

我有两个日期字段下拉菜单,最终用户可以从中选择开始日期和结束日期。但是,当我运行查询时,我错过了第一个日期,即 - 我选择了 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 Sub FindItem2()
    SQL2.AddParam("@datestart", dateStart2.Value)
    SQL2.AddParam("@dateend", dateEnd2.Value)
    LoadGrid("SELECT SUBSTRING(CustomerNumber, PATINDEX('%[^0]%', CustomerNumber+'.'), LEN(CustomerNumber)),'D','CAFET','', sum(Total) as totalsales FROM ViewDetailedSalesReport WHERE DateSold >= DateAdd(day,-1,@datestart) AND DateSold < (@dateend) GROUP BY CustomerNumber, CustomerLastName ORDER BY CustomerLastName ASC; ")
End Sub

我按照 Cetin 的建议使用 >= 和

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

【问题讨论】:

  • 24 小时制永远不会读取“24:00:00”,因为它与“00:00:00”相同。您可能想改用“23:59:59”作为“结束时间”。
  • 您的修改与我的不符。请将时间部分放在一起,不要转换为字符串。只需将参数添加为 DateTime 值(使用 dtPicker.Value.Date 删除时间部分。
  • ViewDetailedSalesReport.DateSold 是什么数据类型?如果是DATETIME,表中的值是否真的有时间,或者时间都归零了?同样的问题适用于脚本中的 datestartdateend 变量。他们是 DATESDATETIMEs 还是 DATETIMEs 的次数为零?
  • @digital.aaron - 他们是没有时间的约会。它们在原始导出中显示为 YYYYMMDD。 @Cetin Bosoz - 完全删除了我的代码,并修改了你的代码以在环境中工作。我让它正常工作。我再次编辑了 OP 以反映更改。我只是无法理解为什么我的原始代码会中断一天,以及为什么将其更改为 >= 和
  • 然后将所有日期时间转换为日期以进行比较。它将大大简化事情。此外,如果想出了适合您的解决方案,您可以将其发布为您自己问题的答案。

标签: sql vb.net datetime


【解决方案1】:

尝试将 DateTime 值转换为字符串并在 MS SQL Server 中使用 Between 使用 DateTime 范围检查时出错。之间就像说 x >= y 和 x = y 和 x

Private Sub FindItem2()
   dim cmd as string = <sql>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;
       </sql>
        SQL2.AddParam("@datestart", dateStart.Value.Date)
        SQL2.AddParam("@dateend", dateEnd.Value.Date.AddDays(1))
        LoadGrid(cmd)
End Sub 

我假设在您的示例代码中 .AddParam 正在执行以下操作:

sqlCommand.Parameters.Add("@dateStart", SqlDbType.Date).Value = dateStart.Value.Date

而 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

【讨论】:

  • 感谢您的回复!我拿了你的代码,它确实运行了,但我现在得到了两天的补偿。我错过了第一天,它似乎在第二天拉,现在我在最后得到了额外的一天。即 - 5th - 10th 正在拉 6th - 11th。有任何想法吗? .AddParam 只是编写 SQL 查询的保障。我没有将直接值传递给 SQL 查询,而是首先设置一个参数并将其传递给查询。是的,加载网格只是将我的查询显示到数据表中。
  • 我已经用“解决方案”更新了我的 OP,尽管我不确定按照我的方式进行操作的最佳实践。我仍然不确定如何通过 DateAndTime Picker 确定 TIME,因为唯一显示的是日期,而不是时间。
  • @Tohny.Johnson,我不明白你的意思是 5th-10th 拉 6th-11th 是什么意思。如果选择的日期是 2020 年 1 月 1 日和 2020 年 1 月 31 日(无论时间部分是什么),代码将提取 2020 年 1 月的整个数据。我想知道您的 SQL2.AddParam 是否有问题。为什么不简单地使用 cmd.Parameters.Add()。
猜你喜欢
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多