【问题标题】:Select records created in a 24 hour time-frame选择在 24 小时时间范围内创建的记录
【发布时间】:2015-04-22 07:24:40
【问题描述】:

我正在尝试查询我们的数据库以查找在昨天早上 6 点到今天早上 6 点之间创建的所有记录。这将在一天中的任何时候在报告中运行,因此设置的时间/日期是无用的。

到目前为止我有这个:-

SELECT * FROM DaySummaryDetail DSD
WHERE DSD.FromDateTime BETWEEN DATEADD(DAY, -1, GetDate()) 
AND DATEADD(Day, 1, GetDate())

但显然这仅适用于从现在到现在的 24 小时前。我不知道如何应用时间和日期。

我在网上找到的每个示例似乎都略有不同,并使用设置的日期/时间,即>= 20/02/2015 06:00:00

我通常使用 Oracle SQL,它可以简单地使用:-

ptt.mod_date_time >= TRUNC (SYSDATE - 1) - 2 / 24
AND ptt.mod_date_time <= TRUNC (SYSDATE - 1) + 22 / 24

这将返回从晚上 10 点到晚上 10 点的结果,但格式在 SQL Server 中看起来完全不同。

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • 对不起,我应该添加那个!现在是 2012 年。标题已编辑!

标签: sql-server datetime sql-server-2012


【解决方案1】:

您可以通过执行以下操作获得您所追求的datetime 值:

SELECT DATEADD(HOUR,6,CONVERT(DATETIME, CONVERT(DATE ,GETDATE()))) Today6AM,
       DATEADD(HOUR,-18,CONVERT(DATETIME, CONVERT(DATE ,GETDATE()))) Yesterday6AM

通过这样做:CONVERT(DATE ,GETDATE()) 您正在剥离今天日期的时间部分。将其转换回 datetime 会为您提供今天的午夜。

查询为今天的早上 6 点加上当天的午夜 6 小时,并从当天的午夜减去 18 小时,得到前一天的早上 6 点。

输出:

Today6AM                 Yesterday6AM
================================================
2015-02-20 06:00:00.000  2015-02-19 06:00:00.000

因此将其添加到您的查询中:

SELECT * 
FROM DaySummaryDetail DSD
WHERE DSD.FromDateTime 
      BETWEEN DATEADD(HOUR,-18,CONVERT(DATETIME, CONVERT(DATE ,GETDATE()))) 
          AND DATEADD(HOUR,6,CONVERT(DATETIME, CONVERT(DATE ,GETDATE())))

【讨论】:

  • 谢谢你 - 我想了一会儿你的答案不起作用,-18 只需要在 6 之前排在第一位。你的答案非常清晰易读,解决了我的问题问题完美。非常感谢使用我的代码的示例,这使得将其应用于我正在做的事情变得更加容易。谢谢!
  • @LuckySevens 没问题,乐于助人。已更新帖子,固定之间的子句。
【解决方案2】:
DECLARE @StartTimestamp          datetime
DECLARE @EndTimestamp            datetime
DECLARE @HourPartOfSearchRange   nvarchar(6)

SET @HourPartOfSearchRange       = ' 06:30'
SET @StartTimestamp              = 
CAST((CONVERT(varchar(11), DATEADD(DAY,-1,@CurrentUTCDateTime), 106) + @HourPartOfSearchRange) AS datetime)

SET @EndTimestamp                = 
CAST((CONVERT(varchar(11), @CurrentUTCDateTime, 106) + @HourPartOfSearchRange) AS datetime)

SELECT * FROM dbo.Test Where Timestamp between @StartTimestamp AND @EndTimestamp

【讨论】:

    【解决方案3】:

    今天早上 6 点

    dateadd(hour,6,cast(cast(getdate() as date) as datetime))
    

    cast(getdate() as date) 截断时间部分,将其转换回日期时间,因为 dateadd 否则不会添加小时并添加 6 小时

    【讨论】:

      【解决方案4】:

      一个解决方案是这样的:

      select  *
      from DaySummaryDetail DSD
      where DSD.FromDateTime between cast(cast(cast(getdate()-1 as date) as varchar(30)) + ' 06:00:00.000' as datetime)
          and cast(cast(cast(getdate() as date) as varchar(30)) + ' 06:00:00.000' as datetime)
      

      【讨论】:

        【解决方案5】:

        这应该会有所帮助...

        SELECT DATEADD( hour, 6, CAST(CAST(GETDATE(), AS Date) AS DateTime) ) AS 'Today@6am'
        SELECT DATEADD( hour, 6, CAST(CAST(GETDATE()-1, AS Date) AS DateTime) ) AS 'Yesterday@6am'
        

        【讨论】:

          【解决方案6】:

          在 SQL Server 2012 中,您可以使用 SMALLDATETIMEFROMPARTS 构造一个日期时间值,即今天早上 6 点,如下所示:

          SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 6, 0)
          

          输出: 2015-02-20 06:00:00

          那么您可以在WHERE 子句中使用上述表达式代替GETDATE()

          DECLARE @TodayAt6AM DATETIME = SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), 
                                                                MONTH(GETDATE()), 
                                                                DAY(GETDATE()), 
                                                                6, 
                                                                0)
          SELECT * 
          FROM DaySummaryDetail DSD
          WHERE DSD.FromDateTime BETWEEN DATEADD(DAY, -1, @TodayAt6AM) AND     
                                         DATEADD(Day, 1, @TodayAt6AM)
          

          【讨论】:

            猜你喜欢
            • 2018-03-08
            • 2017-10-01
            • 1970-01-01
            • 2013-06-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多