2

我试图实现一个简单的 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);

有什么帮助吗?

4

6 回答 6

2

你的意思是这样的?

SELECT * 
FROM [Table]
WHERE [Table].[Date Time] between #16/11/2016 14:00:00# and #17/11/2016 14:00:00#

但要注意 MDY - DMY 日期格式..

我更喜欢ODBC C 格式以避免出现问题:

SELECT * 
FROM [Table]
WHERE [Table].[Date Time] between {ts'1970-01-12 14:00:00' } and {ts'1975-01-12 14:00:00'}
于 2016-11-17T09:28:28.080 回答
1

您需要添加可变日期值和固定时间值。

日期/时间常量可能因所有不同的本地格式而变化无常。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 中是“日期零”。

于 2016-11-17T10:00:34.607 回答
0

试试下面的查询

            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。

于 2016-11-17T09:32:01.083 回答
0

您可能希望首先在 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))
于 2016-11-17T09:34:32.953 回答
0

使用 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
于 2016-11-17T09:41:25.303 回答
0

您可以尝试对 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;
于 2016-11-17T09:46:39.877 回答