C# 在查询期间使用sql添加到日期
我有一个表格,记录特定事件发生的时间以及持续的时间。出于我无法理解的原因,它被设计用来存储事件的开始日期、事件的开始时间,然后是事件持续的小时数和分钟数。像这样: EventStartDate | EventStartTime | TimeSpentHours | TimeSpentMinutes 其中EventStartDate是一个dateTime,其小时/分钟始终设置为零,因此,即使它是一个日期时间,所有值都类似于2016年12月22日00:00。事件开始时间是事件开始的军事时间。TimePentHours是,int是事件持续时间的总小时数,TimePentMinutes是分钟数的int。显然,活动花费的总时间是小时加分钟 问题是:给定一个特定的日期时间,我需要能够找到在此期间发生的所有事件。换句话说,给定一个特定的日期时间,我需要得到所有事件的开始日期和时间大于或等于给定的日期时间,小于或等于结束日期和时间 因此,我需要在查询期间根据数据库中的值计算EndDateTime。数据库是SQLServer2008R2。我正在使用C for WinForm应用程序查询数据 到目前为止,我大致有:C# 在查询期间使用sql添加到日期,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个表格,记录特定事件发生的时间以及持续的时间。出于我无法理解的原因,它被设计用来存储事件的开始日期、事件的开始时间,然后是事件持续的小时数和分钟数。像这样: EventStartDate | EventStartTime | TimeSpentHours | TimeSpentMinutes 其中EventStartDate是一个dateTime,其小时/分钟始终设置为零,因此,即使它是一个日期时间,所有值都类似于2016年12月22日00:00。事件开始时间是事件开始的军事时间。Time
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。这正是我想要的。非常感谢!