【问题标题】:Select Records for dates between Start Date/Time and End Date/Time为开始日期/时间和结束日期/时间之间的日期选择记录
【发布时间】:2021-08-05 17:47:11
【问题描述】:

我有一个表,其中 TxDate 列作为时间戳列。我需要从TxDate 之间的表中选择记录:

  • 日期范围(@StartDate 和 @EndDate)和
  • 时间范围(@StartTime 和@EndTime)。 这里@StartTime 大于@EndTime。

输入:

@StartDate = '2021-02-05'
@EndDate   = '2021-02-07'

@StartTime = '20:30:00'
@EndTime   = '03:30:00'

这里我需要输入日期/时间之间TxDate 的表中的所有记录

实际表中的记录:

TxDate BDate Item
2021-02-05 06:00:00.000 2021-02-05 ABC
2021-02-05 13:10:00.000 2021-02-05 ABC
2021-02-05 23:40:00.000 2021-02-05 ABC
2021-02-06 01:40:00.000 2021-02-05 ABC
2021-02-06 05:50:00.000 2021-02-05 ABC
2021-02-06 06:00:00.000 2021-02-06 ABC
2021-02-06 13:10:00.000 2021-02-06 ABC
2021-02-06 23:40:00.000 2021-02-06 ABC
2021-02-07 01:40:00.000 2021-02-06 ABC
2021-02-07 05:50:00.000 2021-02-06 ABC
2021-02-07 10:30:00.000 2021-02-07 ABC
2021-02-08 02:30:00.000 2021-02-07 ABC
2021-02-08 11:00:00.000 2021-02-08 ABC

所需输出:

TxDate BDate Item
2021-02-05 23:40:00.000 2021-02-05 ABC
2021-02-06 01:40:00.000 2021-02-05 ABC
2021-02-06 23:40:00.000 2021-02-06 ABC
2021-02-07 01:40:00.000 2021-02-06 ABC
2021-02-08 02:30:00.000 2021-02-07 ABC

【问题讨论】:

  • 在您的示例中,您应该有两条记录作为结果。没关系 ??前两条记录
  • StartTime 是否只与StartDate 相关,而EndTime 仅与EndDate 相关,还是意味着无论何时,时间都必须在StartTime 和@987654338 之间@?如果是后者,它是如何工作的,这是否意味着“在 3:30 之前或 20:30 之后”?
  • 我已经更新了细节以便更好地理解,如果您还有任何问题,请告诉我

标签: sql-server


【解决方案1】:

您不能将日期时间值拆分为日期和时间,您需要单独的日期和时间列来满足您的条件。你可以这样做:

SELECT * -- or the columns you need--
FROM theTable -- the name of the table--
WHERE 
     (StartDate <= @startdate)
AND 
     (EndDate >= @enddate)
AND 
     (StartTime <= @starttime)
AND
     (EndTime >= @endtime)
-- if your query is not about the exact StartDate and EndDates, just remove '=' --

希望对您有所帮助。你,但如果不方便给我更多信息来为你编辑这个

【讨论】:

    【解决方案2】:

    你期待这样的时刻吗?

    SELECT *
    FROM theTable
    WHERE 
        TxDate BETWEEN CAST(@StartDate + @StartTime AS datetime) 
               AND CAST(@EndDate + @EndTime AS datetime)
    

    【讨论】:

      【解决方案3】:

      由于您的列是日期时间 - 您需要获取该范围内所有可能的日期,然后过滤掉时间。问题是如何处理边缘情况 - 例如,对于 2021 年 2 月 5 日的开始日期,您是否要包括 00:00:00.000 和 03:30:00 之间的时间以及 2021 年的结束日期-02-07 是否要包括 20:30:00 到 23:59:59 之间的时间?

      我假设你不想包含这些:

      Declare @startDate date = '2021-02-05'
            , @endDate date = '2021-02-07'
            , @startTime time(0) = '20:30:00'
            , @endTime time(0) = '03:30:00';
      
      Declare @startRange datetime = cast(@startDate As datetime) + cast(@startTime As datetime)
            , @endRange datetime = cast(@endDate As datetime) + cast(@endTime As datetime);
      
       Select TxDate
            , BDate
            , Item
         From dbo.YourTable
        Where TxDate >= @startRange
          And TxDate <= @endRange
          And cast(TxDate As time(0)) >= @startTime
          And cast(TxDate As time(0)) <= @endTime;
      

      这未经测试 - 未提供样本数据。

      【讨论】:

      • 当我说日期 2021-02-05 和 20:30:00 到 03:30:00 之间的时间。因此,开始日期时间将是“2021-02-05 20:30:00”,结束日期时间将是第二天,而不是同一天“2021-02-06 03:30:00”。
      • 糟糕——因为我无法测试我的复制/粘贴错误。我编辑了答案以使用 endDate 和 endTime 计算 endRange。
      【解决方案4】:

      也许使用BDate 字段会有所帮助:

      declare @startDate datetime, @endDate datetime,
              @startTime datetime, @endTime datetime
      select  @startDate = '2021-02-05',  @endDate = '2021-02-07',
              @startTime = '20:30:00',    @endTime = '03:30:00'
      
      select * from actualTable
      where cast(BDate as datetime) between @startDate and @endDate
          and TxDate between cast(BDate as datetime) + @startTime
                      and dateAdd(dd, 1, cast(BDate as datetime)) + @endTime
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多