我有一张表可以跟踪特定事件发生的时间以及持续时间。由于我无法理解的原因,它被设计用于存储事件的开始日期,事件的开始时间,然后是事件持续的小时数和分钟数。像这样:
EventStartDate | EventStartTime | TimeSpentHours | TimeSpentMinutes
其中EventStartDate是一个dateTime,其小时/分钟始终设置为零,因此,即使它是一个日期时间,所有值都是“12/22/2016 00:00”。 EventStartTime是一个char(4),它是事件开始的军事时间。 TimeSpentHours是和int,它是事件持续时间的总小时数,TimeSpentMinutes是分钟数的int。显然,活动花费的总时间是小时加分钟。
问题:在给定特定DateTime的情况下,我需要能够找到在此期间发生的所有事件。换句话说,给定一个特定的DateTime,我需要获得所有事件的开始日期和时间大于或等于给定的DateTime并且小于或等于“结束”日期和时间。
所以我需要在查询期间根据数据库中的值计算“EndDateTime”。数据库是SqlServer 2008 R2。我正在使用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以创建新的“临时”列,然后将TIMESPENTHOURS和TIMESPENTMINUTES添加到另一个新列中“临时“列,然后查询给定的特定DateTime值???
答案 0 :(得分:1)
可以在具有公共表表达式的单个查询中实现此目的:
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;
基本上,您可以从开始时间中提取小时和分钟,并将它们添加到开始日期,以获得真实的datetime
开始日期。与结束日期类似。这里没有必要使用common-table表达式,但它确实使代码更具可读性。然后,您只需将普通日期与输入参数进行比较。
答案 1 :(得分:0)
这里我已经解开了最终查询的部分。您需要将最终部分放入您的查询中,无论您需要它。
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