2

如果出现以下情况,如何逐月搜索数据:

txtbox1.text = "m/y" 或 "06/2013"

txtbox2.text = "m/y" 或 "09/2013"

mysql查询代码:

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

如果,表中的记录是:

id 名称 日期寄存器

1 美国广播公司 05/05/2013

2 CCC 06/05/2013

3 日 01/06/2013

4 ggg 2013 年 1 月 7 日

5 ttt 10/07/2013

6 公里 20/08/2013

7 ooo 2013 年 1 月 9 日

我只想从“06/2013”​​月到“09/2013”​​获取数据,我得到的数据是:

3 日 01/06/2013

4 ggg 2013 年 1 月 7 日

5 ttt 10/07/2013

6 公里 20/08/2013

7 ooo 2013 年 1 月 9 日

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

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

导入 MySql.Data.MySqlClient

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

将 conn 调暗为新的 MySqlConnection(connString)

暗淡适配器作为新的 MySqlDataAdapter

将 ds 调暗为新 DSReportPO

将 cmd 调暗为 MySqlCommand

月x1= txtbox1.text

月x2 = txtbox2.text

cmd = New MySqlCommand("SELECT * FROM tb_user WHERE dateregister?...", conn)

适配器.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(新 Microsoft.Reporting.WinForms.ReportDataSource(“DSPOListSETUP”,ds.Tables(0)))

Frm1.ReportViewer1.DocumentMapCollapsed = True

Frm1.ReportViewer1.RefreshReport()

多谢

4

4 回答 4

2

你只需要使用BETWEEN关键字。

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

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

有关日期格式,请参阅此链接。

于 2013-09-17T06:13:27.447 回答
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/2013并与列的转换方式一样09/2013被连接并转换为日期。01/dateregister

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

如果您在搜索日期方面需要更快的性能,则需要将列的数据类型更改dateregisterDATETIME 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)
于 2013-09-17T07:31:23.337 回答
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

或者

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

试试这个小提琴

Mysql日期格式

于 2013-09-17T06:13:46.630 回答
1

处理时间部分的有效方法也是重写代码如下

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) 
于 2013-09-17T06:26:06.370 回答