【问题标题】:TSQL Filtering a query by time / hoursSQL按时间/小时过滤查询
【发布时间】:2013-10-27 14:52:51
【问题描述】:

好的,我正在从 Visual Studio 2008 中运行查询生成器。我正在尝试按时间过滤查询结果;也就是我想把昨天开始到昨天中午的所有东西都拉出来。 我昨天一直在使用 GETDATE()-1,它会拉出一个时间戳 mm/dd/yyyy hh:mm:ss 但是,它会拉动当前时间。为了让它从一天的开始运行,我附加了时间戳以删除时间本身,所以它从一天的开始开始:

convert(varchar(10), getdate()-1, 120)

所以我使用 between 来查找范围,我有: BETWEEN convert(varchar(10), getdate()-1, 120) AND // 这是我需要在中午切断它的地方。

我知道 datetime 在这里是一种数据类型,所以我尝试使用日期部分减去小时/分钟/秒,但 datepart() 只返回整数,不影响时间。

想法?中午怎么把这个剪掉

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql-server tsql datetime getdate datepart


【解决方案1】:

如果您想获得过去 30 分钟的结果,您需要使用它。您也可以将MINUTE 更改为HOUR

--Get now, hour and second included    
DECLARE @NOW DATETIME = GETDATE() 

--Get 30 mins from now
DECLARE @TranDate DATETIME 
SET @TranDate = CONVERT(DATETIME, CONVERT(DATETIME, DATEADD(MINUTE,-30,@NOW))) 

之后,将以下代码添加到您的 where 语句中,

AND TK.TransactionDate >= @TranDate

【讨论】:

    【解决方案2】:
    between DateAdd(day, -1, cast(getdate() as date)) and DateAdd(hour, -12, cast(getdate() as date))
    

    编辑:如 cmets 中所述,您不能将小时与日期一起使用,您必须将其转换回日期时间,因此:

    between DateAdd(day, -1, cast(getdate() as date)) and DateAdd(hour, -12, cast(cast(getdate() as date) as datetime))
    

    【讨论】:

    • 好点,需要在我们花几个小时之前将其转换回日期时间。 and DateAdd(hour, -12, cast(cast(GetDate() as date) as DateTime)) 不需要投票,因为它几乎就在那里。
    【解决方案3】:

    试试这个:

    --Variables
    declare @now datetime = getdate(),
            @yesterday datetime
    
    --Yesterday starting datetime
    select @yesterday = convert(datetime, convert(date, dateadd(day,-1,@now)))
    
    --Your query to filter between y'day start and y'day noon
    --Note that between means inclusive boundary values. (or use >= and <=)
    select * from yourTable
    where dateCol between @yesteray and dateadd(hour,12,@yesterday)
    

    【讨论】:

      【解决方案4】:
      SELECT * FROM T WHERE YourDate BETWEEN CAST(GETDATE()-1 As DATE) AND DATEADD(Hour, -12, CAST(CAST(GETDATE() As DATE) As DATETIME) )
      

      请注意,因为BETWEEN 将包括下限和上限,因此如果您不希望考虑到yesterday at 12:00,只需将BETWEEN 替换为x &gt;= y and y &lt; z

      【讨论】:

      • "错误信息:日期函数 dateadd 不支持数据类型 date 的 datepart 小时"
      【解决方案5】:
      DECLARE
          @Min DATETIME
        , @Max DATETIME
      
      SELECT
          @Min = DATEADD(DAY, -1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))
        , @Max = DATEADD(HOUR, 12, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))
      
      SELECT *
      FROM <Table> x
      WHERE x.[Date] BETWEEN @Min AND @Max
      

      【讨论】:

      • 在查询设计器中,不支持声明语句
      • 我没有代表可以回答,但它稍作修改即可在查询设计器中工作。谢谢你们!在 CAST(GETDATE() - 1 AS DATE) 和 DATEADD(HOUR, 12, CAST(FLOOR(CAST(GETDATE() - 1 AS FLOAT)) 作为 DATETIME)) 之间
      • @user2716330 如果有效,您能接受我的回答并取消投票吗?
      猜你喜欢
      • 2018-05-27
      • 2020-08-07
      • 2021-01-17
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2013-07-10
      相关资源
      最近更新 更多