Date range in vb.net - vb.net

I have following code and I can filter data on grid but when I pick same date in 2 datepicker it shows nothing. How can I fix the problem. Any help will be appreciated.
con = New SqlCeConnection(constring)
con.Open()
cmd = New SqlCeCommand("SELECT * FROM tblMeter WHERE (Date >= #startDate) AND (Date < #endDate)", con)
Dim param1, param2 As SqlCeParameter
param1 = New SqlCeParameter("#startDate", DateTimePicker1.Value)
param2 = New SqlCeParameter("#endDate", DateTimePicker2.Value)
cmd.Parameters.Add(param1)
cmd.Parameters.Add(param2)
Dim da As New SqlCeDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
con.Close()
DataGridView1.DataSource = dt
Thanks

param2 = New SqlCeParameter("#endDate", DateTimePicker2.Value.AddDays(1))

Remember that Sql Server interprets a date like this: 2010-06-23
as a date like this: 2010-06-23 00:00:00.000.
In other words, even if you use >= and <= to check the range at both ends you're still only giving yourself a one millisecond timespan. Sometimes you get away with that if all the dates in the column have no time component, but it's rarely what you really want. Instead, you need to add one day to the end of your range so that your filter includes the entire day, and not just the first millisecond.

That's because #endDate implies the time 00:00, to include the whole day add the time 23:59:59. Or add 1 to #endDate.

Change your query to less-than or equal-to your end date.
SELECT * FROM tblMeter WHERE (Date >= #startDate) AND (Date <= #endDate)

It's your logic:
If date is 2001 and you input 2001:
2001 >= 2001 - check
2001 < 2001 - Nope

Try changing the exclusive
(Date < #endDate)
to the inclusive
(Date <= #endDate)

You may use:
param1 = New SqlCeParameter("#startDate", DateTimePicker1.Value.ToShortDateString)
param2 = New SqlCeParameter("#endDate", DateTimePicker2.Value.AddMinutes(1))

Related

Getting all the dates between two selected dates

Good afternoon, I'm new to programming and I'm working with VB.NET.
I need to get the difference between two dates and then list all the intermediate dates in listbox1. I tried the following code but it doesn't work.
Private Sub breaks()
Dim date1 As Date = DateTimePicker1.Value.ToString("dd/MM/yyyy")
Dim date2 As Date = DateTimePicker2.Value.ToString("dd/MM/yyyy")
While date1 <= date2
Dim result = date1
ListBox1.Items.Add(result)
Dim term = 1
date1 = DateTimePicker1.Value.AddDays(term)
End While
End Sub
The function is called within a button. When executed it only shows the sidebars but is blank.
The image shows start date 03/10/2020 and end date 03/16/2020, however the result (listbox) does not return anything.
I expected my result to come:
03/10/2020
03/11/2020
03/12/2020
03/14/2020
03/15/2020
03/16/2020
the interval between them.
Can anyone tell me what's wrong?
You can use some linq for a simple solution
ListBox1.DataSource =
Enumerable.Range(0, 2 + DateTimePicker2.Value.Subtract(DateTimePicker1.Value).Days).
Select(Function(offset) DateTimePicker1.Value.AddDays(offset)).
ToList()
It generates a list of numbers to act as the offset from the initial date, then adds them the specified number of times (different between the dates in days) to create all the dates. No loop required.
Credit to this answer
Edit:
This can also be similarly applied to a DataGridView, but in order to make a single column, we would need to select an anonymous type.
DataGridView1.DataSource =
Enumerable.Range(0, 2 + DateTimePicker2.Value.Subtract(DateTimePicker1.Value).Days).
Select(Function(offset) New With {.Date = DateTimePicker1.Value.AddDays(offset)}).
ToList()
You should avoid using strings for datetimes until they need to be text.
The variable date1 can be used for all the dates, like this:
Dim date1 As Date = DateTimePicker1.Value
Dim date2 As Date = DateTimePicker2.Value
While date1 <= date2
ListBox1.Items.Add(date1.ToString("MM/dd/yyyy"))
Dim term = 1
date1 = date1.AddDays(term)
End While
Also, you should make sure to set Option Strict On as the default for new projects, and set it for the current project.

VB.NET Access Datetime Querying Issue

I have a bunch of records in an Access db table with a datetime fields
e.g of records (2/2/2015 3:34:21 PM,2/2/2015 8:29:13 AM )
Problem is I need to run a query where I need all records for displayed to be ones that occurred on the same day regardless of the time. How to best structure this query?
I used 'Select * from table where thetime = 2/2/2015' and there was no result returned. I switched the date format to start with the year, no luck.
Any tips as to sql query syntax for Access will be appreciated. Thanks.
Date/Time values in Access always have both a date and time component, so a date literal like 2015-02-02 is equivalent to 2015-02-02 00:00:00. If you want all rows for that date, regardless of the time, you need to use a WHERE clause like
... WHERE thetime >= {that date} AND thetime < {the following day}
The proper way to do that in VB.NET is to use a parameterized query like this:
Using cmd As New OleDbCommand()
cmd.Connection = con ' an open OleDbConnection
cmd.CommandText =
"SELECT * FROM thetable " &
"WHERE thetime >= ? AND thetime < ?"
Dim targetDate As New DateTime(2015, 2, 2) ' example data
cmd.Parameters.Add("?", OleDbType.DBTimeStamp).Value = targetDate
cmd.Parameters.Add("?", OleDbType.DBTimeStamp).Value = targetDate.AddDays(1)
Using rdr As OleDbDataReader = cmd.ExecuteReader
Do While rdr.Read()
Console.WriteLine(rdr("thetime"))
Loop
End Using
End Using

Query to select data between two dates with the format m/d/yyyy

I am facing problem when i'm trying to select records from a table between two dates.
m using the following query
select * from xxx where dates between '10/10/2012' and '10/12/2012'
this query works for me but when the dates are in format like 1/1/2013.. it doesn't work..
plz solve my problem ASAP.
This solution provides CONVERT_IMPLICIT operation for your condition in predicate
SELECT *
FROM xxx
WHERE CAST(dates AS date) BETWEEN '1/1/2013' and '1/2/2013'
OR
SELECT *
FROM xxx
WHERE CONVERT(date, dates, 101) BETWEEN '1/1/2013' and '1/2/2013'
Demo on SQLFiddle
Try this
SELECT *
FROM xxx
WHERE dates BETWEEN STR_TO_DATE('10/10/2012', '%m/%d/%Y')
AND STR_TO_DATE('10/12/2012', '%m/%d/%Y') ;
or
SELECT *
FROM xxx
WHERE STR_TO_DATE(dates , '%m/%d/%Y') BETWEEN STR_TO_DATE('10/10/2012', '%m/%d/%Y')
AND STR_TO_DATE('10/12/2012', '%m/%d/%Y') ;
$Date3 = date('y-m-d');
$Date2 = date('y-m-d', strtotime("-7 days"));
SELECT * FROM disaster WHERE date BETWEEN '".$Date2."' AND '".$Date3."'
By default Mysql store and return ‘date’ data type values in “YYYY/MM/DD” format.
So if we want to display date in different format then we have to format date values as per our requirement in scripting language
And by the way what is the column data type and in which format you are storing the value.
select * from xxx where dates between '2012-10-10' and '2012-10-12'
I always use YYYY-MM-DD in my views and never had any issue. Plus, it is readable and non equivocal.
You should be aware that using BETWEEN might not return what you expect with a DATETIME field, since it would eliminate records dated '2012-10-12 08:00' for example.
I would rather use where dates >= '2012-10-10' and dates < '2012-10-13' (lower than next day)
SELECT * FROM tablename WHERE STR_TO_DATE(columnname, '%d/%m/%Y')
BETWEEN STR_TO_DATE('29/05/2017', '%d/%m/%Y')
AND STR_TO_DATE('30/05/2017', '%d/%m/%Y')
It works perfectly :)
you have to split the datetime and then store it with your desired format like dd/MM/yyyy. then you can use this query with between but i have objection using this becasue it will search every single data on your database,so i suggest you can use datediff.
Dim start = txtstartdate.Text.Trim()
Dim endday = txtenddate.Text.Trim()
Dim arr()
arr = Split(start, "/")
Dim dt As New DateTime
dt = New Date(Val(arr(2).ToString), Val(arr(1).ToString), Val(arr(0).ToString))
Dim arry()
arry = Split(endday, "/")
Dim dt2 As New DateTime
dt2 = New Date(Val(arry(2).ToString), Val(arry(1).ToString), Val(arry(0).ToString))
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
here i have used dd/MM/yyyy format.
use this
select * from xxx where dates between '10/oct/2012' and '10/dec/2012'
you are entering string, So give the name of month as according to format...
Try this:
select * from xxx where dates between convert(datetime,'10/10/2012',103) and convert(dattime,'10/12/2012',103)
DateTime dt1 = this.dateTimePicker1.Value.Date;
DateTime dt2 = this.dateTimePicker2.Value.Date.AddMinutes(1440);
String query = "SELECT * FROM student WHERE sdate BETWEEN '" + dt1 + "' AND '" + dt2 + "'";

VB DataView.RowFilter and Cast Before Compare

In the following DataView.Rowfilter filter, Request_Date is a smalldatetime:
dv.RowFilter = "Request_Date >= '01/01/2012' and Request_Date <= '12/31/2012'"
The problem with this is that smalldatetime is MM/dd/yyyy hh:mm:ss, but it is compared to a string with the format 'MM/dd/yyyy'. This means that the filter will automatically convert the strings to smalldatetime, so the comparison only shows date/times between 1/1/2012 at 12AM and 12/31/2012 at 12AM. Any rows with dates later in the day on 12/31/2012 will not get picked up by this filter. I know that I can add a day to the end date or concatenate, say, 12:59:59 to the end of the date to pick up the other times in the day, but I was hoping for somthing more elegant, along the lines of the sql equivalent ...CONVERT(smalldatetime, Request_Date, 101) <= '12/31/2012'. Is there any way that I can get a different date format for a DataView field or am I stuck massaging the end date prior to comparison?
FYI, current best option is this:
dv.RowFilter = "Request_Date >= #" & dtpStartDate.DateText & "# and Request_Date <= #" & DateAdd(DateInterval.Day, 1, dtpEndDate.DateValue) & "#"
Thanks for your help!
If you're using at least .NET 3.5, you can use Linq-To-DataSet which is more readable:
DataTable filtered = dv.Table
.AsEnumerable()
.Where(r => r.Field<DateTime>("Request_Date") >= dtpStartDate.Value
&& r.Field<DateTime>("Request_Date") < dtpEndDate.Value.AddDays(1))
.CopyToDataTable();
Add using.System.Linq; and a reference to System.Data.DataSetExtensions.dll.
Edit: I've only just seen that VB.NET is tagged:
Dim filtered = From row In dv.Table
Where row.Field(Of DateTime)("Request_Date") >= dtpStartDate.Value AndAlso _
row.Field(Of DateTime)("Request_Date") < dtpEndDate.Value.AddDays(1)
Dim tblFiltered = filtered.CopyToDataTable()
Instead of using "<= 12/31/2012", just use "< 1/1/2013" - that is the most elegant and gets exactly what you want.

Custom validation for from and to date in vb.net?

i am developing web application in vb.net, using Custom validation how to validate the from date and To date..
i need to validate the Date in the asp:textbox should be "dd/mm/yyyy" format and i have two date like from date and Todate. So the Todate should not be less then start date, Can anyone please help me,
Thanks in advance.
This is VB.Net Way to do it. You can modify it to fit asp.net
Dim date1 As DateTime = "01/01/2000"
Dim date2 As DateTime = "07/09/2012"
Dim myDate As DateTime = InputBox("Date?")
If myDate >= date1 AndAlso myDate <= date2 Then
MsgBox("Between")
Else
MsgBox("Not between")
End If