选择昨天和今天之间的记录

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:0017-Nov-16 18:00:00。有可能吗?如果我使用Now()-1,它将在 16-Nov-16 19:00:0017-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 PM17/10/2016 2:00:00 PM17/10 /2016 年上午 10:00:002016 年 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

【讨论】:

谢谢。虽然这不是我要找的,但感谢您的帮助。

以上是关于选择昨天和今天之间的记录的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 选择从昨天开始存储为纪元的记录

vue+element DatePicker日期选择器封装(可自定义快捷选择时间)

在两个动态(可变)日期 SQL 之间进行选择

LayUI laydate日期选择器自定义 快捷选中今天昨天 本周本月等等

LayUI laydate日期选择器自定义 快捷选中今天昨天 本周本月等等

怎么用sql查询昨天,今天,明天和本周的记录