选择在24小时时间范围内创建的记录

时间:2015-02-20 15:00:18

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

我正在尝试查询我们的数据库,以查找昨天早上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中的格式看起来完全不同。

6 个答案:

答案 0 :(得分:3)

通过执行以下操作,您可以获得所需的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())))

答案 1 :(得分:1)

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 @StartTimestamp与@EndTimestamp之间的时间戳

答案 2 :(得分:1)

今天早上6点是

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

cast(getdate() as date)截断时间段,将其转换为日期时间,因为dateadd不会增加小时数,否则会增加6小时

答案 3 :(得分:1)

一种解决方案就是这样:

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)

答案 4 :(得分:1)

这应该有帮助...

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'

答案 5 :(得分:1)

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

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

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

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

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)