如果在以下情况下如何搜索每月的数据:
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()
非常感谢
答案 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/2013
和09/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'
答案 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)