选择昨天和今天之间的记录
Posted
技术标签:
【中文标题】选择昨天和今天之间的记录【英文标题】:Select records between yesterday and today 【发布时间】:2016-11-17 09:14:51 【问题描述】:我试图实现一个简单的 SQL 查询,获取今天的固定时间(例如 18:00)和昨天的固定时间(例如 18:00)之间的记录。
SELECT * FROM [Table]
WHERE [Table].[Date Time] > Now()-1;
但是,这将返回今天当前时间和昨天之间的所有记录。
有没有办法在指定的时间内返回记录?
编辑: 我试过这个查询,但它抛出语法错误。
SELECT * FROM [Table]
WHERE [Date Time] BETWEEN FORMAT(DATEADD(DAY, - 1, NOW()) AS DATETIME) + FORMAT('18:00:00' AS TIME) AND FORMAT(NOW() AS DATETIME) + FORMAT('18:00:00' AS TIME);
有什么帮助吗?
【问题讨论】:
添加更多细节。像例子 @Mr.Bhosale 如果假设现在是 17-Nov-16 19:00:00,我想返回 16-Nov-16 18:00:00 至 17-Nov-16 18:00:00。有可能吗?如果我使用Now()-1
,它将在 16-Nov-16 19:00:00 和 17-Nov-16 19:00:00 之间返回
@Fionnuala 它仍然返回给我一个语法错误。 SELECT * FROM [In process analysis result] WHERE [Date Time] BETWEEN FORMAT(DATEADD("h", -25, NOW()) AS DATETIME) + FORMAT('18:00:00' AS TIME) AND FORMAT(NOW() AS DATETIME) + FORMAT('18:00:00' AS TIME);
【参考方案1】:
你的意思是这样的?
SELECT *
FROM [Table]
WHERE [Table].[Date Time] between #16/11/2016 14:00:00# and #17/11/2016 14:00:00#
但要注意 MDY - DMY 日期格式..
为了避免问题,我更喜欢ODBCC 格式:
SELECT *
FROM [Table]
WHERE [Table].[Date Time] between ts'1970-01-12 14:00:00' and ts'1975-01-12 14:00:00'
【讨论】:
是的,它是类似的东西。但我不想硬编码日期时间。如果今天是 16 年 11 月 17 日,它将在 16 年 11 月 16 日和 16 年 11 月 17 日之间进行查询。如果明天是 16 年 11 月 18 日,它将在 16 年 11 月 17 日和 16 年 11 月 18 日之间查询。 看看我的其他答案【参考方案2】:您需要添加可变日期值和固定时间值。
日期/时间常量可能因所有不同的本地格式而变化无常。使用TimeSerial
,我们可以避免这种情况:
SELECT *
FROM [Table]
WHERE [Table].[Date Time] Between Date()-1 + TimeSerial(18,0,0)
And Date() + TimeSerial(18,0,0)
(第一个建议,使用德语日期格式)
SELECT *
FROM [Table]
WHERE [Table].[Date Time] Between Date()-1 + #18:00:00# And Date() + #18:00:00#
查询设计器可能会自动将其更改为
Between Date()-1 + #12/30/1899 18:00:00# And Date() + #12/30/1899 18:00:00#
1899-12-30
在 Access 中是“日期零”。
【讨论】:
谢谢。我的 [日期时间] 列定义为dd/mm/yyyy hh:mm:ss
我使用了您的查询,它没有任何语法错误,但它没有显示任何记录。在我的数据库中,我有 17/10/2016 6:00:00 PM、17/10/2016 2:00:00 PM、17/10 /2016 年上午 10:00:00,2016 年 16 月 10 日下午 7:00:00。但它没有显示任何这些......
@YongXiangSoh:列格式应该不会有任何影响。也许尝试#6:00:00 PM#
而不是#18:00:00#
。
@YongXiangSoh:或TimeSerial
用于日期格式独立性,请参阅编辑。
@Andre 我试过SELECT * FROM [In process analysis result] WHERE [Date Time] Between Date()-1 + #12/30/1899 6:00:00 PM# And Date() + #12/30/1899 6:00:00 PM#
,但它仍然没有返回任何记录。有什么问题吗?
@MtwStark:你读过这个问题吗?它要求 18:00(前一天)和 18:00(今天)之间的记录。不在 00:00 到 23:59 之间。【参考方案3】:
试试下面的查询
declare
@StartDate DATE = NULL,
@EndDate DATE = NULL
SELECT * FROM [Table]
WHERE
CAST( [Date Time] AS DATE) >= CAST( ISNULL(@StartDate, '') AS DATE)
AND CAST( [Date Time] AS DATE) <= CAST( ISNULL(@EndDate, '') AS DATE)
或者简单地将日期放入@StartDate 和@EndDate。
【讨论】:
这是 SQL Server 的示例。 SQL 是一个通用标签,这个标签是 MS Access。【参考方案4】:您可以尝试对 SQL Server 进行以下查询:
SELECT * FROM [Table]
WHERE DATEADD(HH, 18, CAST(CAST([Table].[Date Time] AS DATE) AS DATETIME)) > DATEADD(HH, 18, CAST(CAST(Now() AS DATE) AS DATETIME))-1;
【讨论】:
谢谢。但我正在使用 MS Access。有什么区别吗? 我对 MS Access 不太了解。您将需要更改 MS Access 中的 Cast 函数,以首先删除时间部分并将其转换为日期时间并添加小时。【参考方案5】:您可能希望首先在 18.00 为今天的日期声明一个变量,然后将您的日期与该日期进行比较,在 Access 中您可以使用 TimeValue() 函数:
Dim Time18
Time18 = TimeValue("18:00")
然后您可以将您的日期与该日期和前一天进行比较:
SELECT * FROM [Table]
WHERE (
(DateValue([Table].[Date Time]) = DateValue(Now() - 1) AND
TimeValue([Table].[Date Time]) >= Time18) OR
(DateValue([Table].[Date Time]) = DateValue(Now() AND
TimeValue([Table].[Date Time]) <= Time18))
【讨论】:
那是 SQL Server,不是 MS Access。 @Fionnuala 你能帮忙吗?【参考方案6】:使用 date() 代替 now()
假设今天是 17 月 17 日(任何时间),
如果你需要昨天 16nov (00:00 -> 23:59) 的记录,你必须使用 date()-1 作为下限和 date() 作为上限
SELECT *
FROM [Table]
WHERE [Table].[Date Time] between date()-1 and date()
如果您需要今天 17nov (00:00 -> 23:59) 的记录,您必须使用 date() 作为下限和 date()+1 作为上限
SELECT *
FROM [Table]
WHERE [Table].[Date Time] between date() and date()+1
这是简单的版本,边界有点问题,正确的过滤器应该是(昨天)
SELECT *
FROM [Table]
WHERE [Table].[Date Time] >= date()-1 [Table].[Date Time] < date()
或者,今天:
SELECT *
FROM [Table]
WHERE [Table].[Date Time] >= date() [Table].[Date Time] < date()+1
【讨论】:
谢谢。虽然这不是我要找的,但感谢您的帮助。以上是关于选择昨天和今天之间的记录的主要内容,如果未能解决你的问题,请参考以下文章
vue+element DatePicker日期选择器封装(可自定义快捷选择时间)
LayUI laydate日期选择器自定义 快捷选中今天昨天 本周本月等等