如果我有这种情况,我应该在MS SQL Server中使用什么是正确的日期格式?
--This values here will be supplied by a datetimepicker Control
@StartDate = '05/15/2013 10:00 PM'
@EndDate = '05/16/2013 06:00 AM'
SELECT *
FROM tblSomething
WHERE TransDate >= @StartDate AND TransDate <= @EndDate
如何格式化TransDate字段?
这是正确的吗?
Declare @StartDate as datetime
Declare @EndDate as datetime
set @StartDate = '05/15/2013 10:00 PM'
set @EndDate = '05/16/2013 06:00 AM'
Select * from tblSomething Where convert(varchar(20),TransDate,100) >= convert(varchar(20),@StartDate,100) and convert(varchar(20),TransDate,100) <= convert(varchar(20),@EndDate,100)
AM / PM对我来说很重要的原因是因为我们的员工的交易从晚上10点开始到第二天早上6点结束。我需要在该时间范围内提取该员工的交易。
答案 0 :(得分:6)
如果您需要考虑日期格式,那么您做错了。
DateTimePicker控件为您提供.Net DateTime类型的值。您的TransDate列应该是Sql Server DateTime类型,@ StartDate和@EndDate参数也应如此。在任何时候你 都不需要将这些中的任何一个表达为字符串。它们应该始终是一种甚至不可读的二进制格式。如果你已经这样做了,那么所写的选择查询就可以做你需要的了。
这是一个例子(C#,如果您愿意,可以做VB),这可能是如何工作的:
//imaginary function to check if there's at least one record in the data range
bool CheckDates(DateTime startDate, DateTime endDate)
{
//sql is unchanged from your question
string sql = "Select * from tblSomething Where TransDate >= @StartDate AND TransDate <= @EndDate";
using (var cn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql))
{
cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;
cn.Open()
using (SqlDataReader rdr = cmd.ExecuteReader())
{
//all we care is whether there's at least one row
// there is a row if and only if .Read() succeeds
return rdr.Read();
}
}
}
您可以这样称呼它:
//hopefully you picked better control names :)
if (CheckDates(dateTimePicker1.Value, dateTimePicker2.Value))
{
//do something
}
重要的是,在任何地方都没有将DateTime转换为字符串。