C# 在查询期间使用sql添加到日期

C# 在查询期间使用sql添加到日期,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个表格,记录特定事件发生的时间以及持续的时间。出于我无法理解的原因,它被设计用来存储事件的开始日期、事件的开始时间,然后是事件持续的小时数和分钟数。像这样: EventStartDate | EventStartTime | TimeSpentHours | TimeSpentMinutes 其中EventStartDate是一个dateTime,其小时/分钟始终设置为零,因此,即使它是一个日期时间,所有值都类似于2016年12月22日00:00。事件开始时间是事件开始的军事时间。Time

我有一个表格,记录特定事件发生的时间以及持续的时间。出于我无法理解的原因,它被设计用来存储事件的开始日期、事件的开始时间,然后是事件持续的小时数和分钟数。像这样:

EventStartDate | EventStartTime | TimeSpentHours | TimeSpentMinutes

其中EventStartDate是一个dateTime,其小时/分钟始终设置为零,因此,即使它是一个日期时间,所有值都类似于2016年12月22日00:00。事件开始时间是事件开始的军事时间。TimePentHours是,int是事件持续时间的总小时数,TimePentMinutes是分钟数的int。显然,活动花费的总时间是小时加分钟

问题是:给定一个特定的日期时间,我需要能够找到在此期间发生的所有事件。换句话说,给定一个特定的日期时间,我需要得到所有事件的开始日期和时间大于或等于给定的日期时间,小于或等于结束日期和时间

因此,我需要在查询期间根据数据库中的值计算EndDateTime。数据库是SQLServer2008R2。我正在使用C for WinForm应用程序查询数据

到目前为止,我大致有:

public static List<ImportantEvents> GetEventsDuringDateTime(DateTime timeOfEvent)
        {
            using (SqlConnection sqlConn = getAndOpenSqlConn())
            {
                string theEventTime = timeOfEvent.ToString("hhmm");
                string sqlStmt = "SELECT EVENT_ID,  AGENCY, EVENTSTARTDATE, ACTNOTE, EVENTSTARTTIME, TIMESPENTHOURS, TIMESPENTMINUTES  FROM EVENTSMAIN WHERE((EVENTSTARTDATE<= @MYEVENTDATETIME AND EVENTSTART TIME< @ACTTIME) AND ...";"
            }
        }
上面的SQL显然不起作用,这正是我陷入困境的地方


我的问题是:在查询中,如何将EVENTSTARTTIME添加到EVENTSTARTDATE以创建一个新的临时列,然后将TimePentHours和TimePentMinutes添加到该列的另一个新的临时列中,然后根据给定的特定日期时间值进行查询???

这里我已经分析了最终查询的部分。您需要将最后一部分放入查询中,无论您在哪里需要它

SELECT Combined = EVENTSTARTDATE + EVENTSTARTTIMEFROM FROM EventsMain

SELECT CombinedWithHour = DATEADD(hh, TIMESPENTHOURS, Combined) FROM EventsMain

SELECT CombinedWithMinute = DATEADD(mi, TIMESPENTMINUTES, CombinedWithHour) FROM EventsMain
总而言之:

SELECT DATEADD(mi, TIMESPENTMINUTES,  DATEADD(hh, TIMESPENTHOURS, EVENTSTARTDATE + EVENTSTARTTIME)) FROM EventsMain

可以通过以下通用表表达式在单个查询中实现这一点:

With StartAndEndTimes As (
    Select Event_ID,

        EventStart = DateAdd(Minute, Convert(int, Right(EventStartTime, 2)), DateAdd(Hour, Convert(int, Left(EventStartTime, 2)), EventStartDate)),
        EventEnd = DateAdd(Minute, Convert(int, Right(EventStartTime, 2))+TimeSpentMinutes, DateAdd(Hour, Convert(int, Left(EventStartTime, 2))+TimeSpentHours, EventStartDate)) 
      From EventsMain)
Select Event_Id, EventStart, EventEnd, <<add other fields here>>
  From StartAndEndTimes
  Where EventStart <= @MyEventDateTime
    And EventEnd > @MyEventDateTime;

基本上,您可以从开始时间提取小时和分钟,并将其添加到开始日期,以获得真实的日期时间开始日期。与结束日期类似。这里不需要使用公共表表达式,但它确实使代码更具可读性。然后,只需将普通日期与输入参数进行比较。

Genius。这正是我想要的。非常感谢!