在查询期间使用sql添加日期

时间:2016-11-21 00:27:27

标签: c# sql-server winforms

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

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值???

2 个答案:

答案 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