Select 条在 24 小时内创建的记录
Select records created in a 24 hour time-frame
我正在尝试查询我们的数据库以查找在昨天早上 6 点到今天早上 6 点之间创建的所有记录。这将在一天中的任何时间出现在报告中 运行,因此设置 times/dates 没有用。
到目前为止我有这个:-
SELECT * FROM DaySummaryDetail DSD
WHERE DSD.FromDateTime BETWEEN DATEADD(DAY, -1, GetDate())
AND DATEADD(Day, 1, GetDate())
但显然这只适用于从现在到现在的 24 小时前。我不知道如何应用时间和日期。
我在网上找到的每个例子似乎都略有不同,并使用集合 dates/times 即 >= 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
这会 return 从晚上 10 点到晚上 10 点产生结果,但格式在 SQL 服务器中看起来完全不同。
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 之间的时间戳
今天早上 6 点是
dateadd(hour,6,cast(cast(getdate() as date) as datetime))
cast(getdate() as date)
截断日期部分,将其转换回日期时间,因为 dateadd 不会增加小时数,而是增加 6 小时
一个解决方案是这样的:
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)
您可以通过执行以下操作获得您想要的 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())))
这应该有助于...
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'
在 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)
我正在尝试查询我们的数据库以查找在昨天早上 6 点到今天早上 6 点之间创建的所有记录。这将在一天中的任何时间出现在报告中 运行,因此设置 times/dates 没有用。
到目前为止我有这个:-
SELECT * FROM DaySummaryDetail DSD
WHERE DSD.FromDateTime BETWEEN DATEADD(DAY, -1, GetDate())
AND DATEADD(Day, 1, GetDate())
但显然这只适用于从现在到现在的 24 小时前。我不知道如何应用时间和日期。
我在网上找到的每个例子似乎都略有不同,并使用集合 dates/times 即 >= 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
这会 return 从晚上 10 点到晚上 10 点产生结果,但格式在 SQL 服务器中看起来完全不同。
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 之间的时间戳
今天早上 6 点是
dateadd(hour,6,cast(cast(getdate() as date) as datetime))
cast(getdate() as date)
截断日期部分,将其转换回日期时间,因为 dateadd 不会增加小时数,而是增加 6 小时
一个解决方案是这样的:
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)
您可以通过执行以下操作获得您想要的 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())))
这应该有助于...
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'
在 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)