vb.net - mysql查询选择每个月的记录

时间:2013-09-17 06:00:22

标签: mysql sql vb.net

如果在以下情况下如何搜索每月的数据:

  

txtbox1.text =“m / y”或“06/2013”​​

     

txtbox2.text =“m / y”或“09/2013”​​

mysql查询代码:

  

SELECT * FROM tb_user WHERE dateregister?.....

如果,表中的记录是:

  

id name dateregister

     

1 abc 05/05/2013

     

2 ccc 06/05/2013

     

3 ddd 01/06/2013

     

4 ggg 01/07/2013

     

5 ttt 10/07/2013

     

6 kkm 20/08/2013

     

7 ooo 01/09/2013

我只想把月份“06/2013”​​的数据带到“09/2013”​​,我得到的数据是:

  

3 ddd 01/06/2013

     

4 ggg 01/07/2013

     

5 ttt 10/07/2013

     

6 kkm 20/08/2013

     

7 ooo 01/09/2013

我尝试了各种查询,但我总是失败..

这是我在vb.net中的代码:

  

导入MySql.Data.MySqlClient

     

Dim connString As String =“Database = dbuser; Data Source = localhost; User Id = root; Password =”

     

Dim conn As New MySqlConnection(connString)

     

Dim adapter As New MySqlDataAdapter

     

Dim ds As New DSReportPO

     

Dim cmd As MySqlCommand

     

monthx1 = txtbox1.text

     

monthx2 = txtbox2.text

     

cmd =新的MySqlCommand(“SELECT * FROM tb_user WHERE dateregister?...”,conn)

     

adapter.SelectCommand = cmd

     

adapter.Fill(ds.Tables(0))

     

Frm1.Show()

     

Frm1.ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local

     

Frm1.ReportViewer1.LocalReport.ReportPath = System.Environment.CurrentDirectory& “\ Report1.rdlc”

     

Frm1.ReportViewer1.LocalReport.DataSources.Clear()

     

Frm1.ReportViewer1.LocalReport.DataSources.Add(New Microsoft.Reporting.WinForms.ReportDataSource(“DSPOListSETUP”,ds.Tables(0)))

     

Frm1.ReportViewer1.DocumentMapCollapsed = True

     

Frm1.ReportViewer1.RefreshReport()

非常感谢

4 个答案:

答案 0 :(得分:2)

您只需使用BETWEEN关键字。

 SELECT * FROM tb_user 
 WHERE dateregister between @textBox1Value and @textBox2Value

确保您解析的日期(@ textBox1Value和@ textBox2Value)输入正确。

请参阅此链接了解date formatting

答案 1 :(得分:2)

SELECT  *
FROM    tableName
WHERE   STR_TO_DATE(dateregister, '%d/%m/%Y')
        BETWEEN STR_TO_DATE(CONCAT('01/', '06/2013'), '%d/%m/%Y') AND
                LAST_DAY(STR_TO_DATE(CONCAT('01/', '09/2013'), '%d/%m/%Y'))

输出

╔════╦══════╦══════════════╗
║ ID ║ NAME ║ DATEREGISTER ║
╠════╬══════╬══════════════╣
║  3 ║ ddd  ║ 01/06/2013   ║
║  4 ║ ggg  ║ 01/07/2013   ║
║  5 ║ ttt  ║ 10/07/2013   ║
║  6 ║ kkm  ║ 20/08/2013   ║
║  7 ║ ooo  ║ 01/09/2013   ║
╚════╩══════╩══════════════╝

上面的查询发生了什么,使用dateregister将列STR_TO_DATE()转换为正确的日期,因为它以dd/mm/YYYY的格式保存为字符串。

您的输入06/201309/2013已与01/连接,并转换为日期,就像列dateregister的转换方式一样。

函数LAST_DAY采用有效日期并返回该月的最后一个日期。

如果您在搜索日期方面需要更快的性能,则需要将列dateregister的数据类型更改为DATETIME or DATE数据类型以避免转换。

其他参考资料


monthx1= txtbox1.text
monthx2 = txtbox2.text
Dim  sqlQuery As new System.Text.StringBuilder
sqlQuery.Append("SELECT * " & vbCrLf)
sqlQuery.Append("FROM   tablename " & vbCrLf)
sqlQuery.Append("WHERE  Str_to_date(dateregister, '%d/%m/%Y') BETWEEN " & vbCrLf)
sqlQuery.Append("       Str_to_date(Concat('01/', " & vbCrLf)
sqlQuery.Append("                   '" & monthx1 & "'), '%d/%m/%Y') AND Last_day( " & vbCrLf)
sqlQuery.Append("              Str_to_date(Concat('01/', " & vbCrLf)
sqlQuery.Append("                          '" & monthx2 & "'), '%d/%m/%Y')) ")
cmd = New MySqlCommand(sqlQuery.ToString(), conn)

答案 2 :(得分:1)

您可以使用BETWEEN查找范围内的日期,并使用DATE_FORMAT格式化查询日期,不确定VB语法

  SELECT * FROM tb_user WHERE
  DATE_FORMAT(STR_TO_DATE(dateregister, '%d/%m/%Y'),'%m/%Y') 
  BETWEEN txtbox1.text AND  txtbox2.text

OR

  SELECT * FROM tb_user WHERE
  DATE_FORMAT(STR_TO_DATE(dateregister, '%d/%m/%Y'),'%m/%Y') 
  BETWEEN '06/2013' AND  '09/2013'

Try this fiddle

Mysql Date format

答案 3 :(得分:1)

处理TIME部分的有效方法也是重写代码,如下所示

SELECT * FROM tb_user 
WHERE 
dateregister >= str_to_date(concat('01/',@textBox1Value ),'%d/%m/%Y') and 
dateregister < date_add(str_to_date(concat('01/',@textBox1Value ),'%d/%m/%Y'),interval 1 month)