0

如果我有这种情况,我应该在 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) 

上午/下午对我来说很重要的原因是因为我们的员工的交易从晚上 10 点开始,到第二天早上 6 点结束。我需要在该时间范围内提取该员工的交易。

4

1 回答 1

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 转换为字符串。

于 2013-05-15T16:58:38.580 回答