午夜事务的SQL查询

午夜事务的SQL查询,sql,sql-server,date,datetime,time,Sql,Sql Server,Date,Datetime,Time,我使用什么查询来获取事务,包括午夜(超过午夜)。例如: 2018年1月1日 我们的百货公司每天从早上7点开到凌晨2点(第二天) 2018年1月1日凌晨2点的销售交易 这是我的问题 WHERE Date BETWEEN '2018-01-01' AND '2018-01-02' and Time >= '1754-01-01 07:00:00.000' and Time <='1754-01-01 01:59:00.000' 其中日期介于“2018-01-01”和“2018-01-

我使用什么查询来获取事务,包括午夜(超过午夜)。例如:

2018年1月1日

我们的百货公司每天从早上7点开到凌晨2点(第二天) 2018年1月1日凌晨2点的销售交易

这是我的问题

WHERE Date BETWEEN '2018-01-01' AND '2018-01-02'
and Time >= '1754-01-01 07:00:00.000' and Time <='1754-01-01 01:59:00.000' 
其中日期介于“2018-01-01”和“2018-01-02”之间

时间>='1754-01-01 07:00:00.000'和时间如果日期列有时间,则只需使用

WHERE Date>='2018-01-01 07:00:00.000' AND Date<='2018-01-02 01:59:00.000'

其中Date>='2018-01-01 07:00:00.000'和Date如果Date列有时间,则只需使用

WHERE Date>='2018-01-01 07:00:00.000' AND Date<='2018-01-02 01:59:00.000'

WHERE Date>='2018-01-01 07:00:00.000'和Date如果您只想获取给定日期的交易,可以在变量中声明日期,然后使用dateadd函数查询搜索(@Date+7小时:上午7点)到(@Date+26小时:次日凌晨2点)之间的记录。为了简单起见,我也在变量中声明了startdate和enddate

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE Date BETWEEN @startdate AND @enddate
但这仅在日期列为datetime数据类型时有效

如果将日期和时间存储在单独的列中,则可以将它们组合起来。像这样:

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE (cast(date as datetime) + cast(cast(time as time) as datetime)) 
BETWEEN @startdate AND @enddate

如果您只想获取给定日期的事务,可以在变量中声明日期,然后对(@date+7小时:上午7点)和(@date+26小时:次日凌晨2点)之间的记录进行查询搜索,这可以通过使用dateadd函数来完成。为了简单起见,我也在变量中声明了startdate和enddate

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE Date BETWEEN @startdate AND @enddate
但这仅在日期列为datetime数据类型时有效

如果将日期和时间存储在单独的列中,则可以将它们组合起来。像这样:

Declare @date datetime = '2018-01-01';
Declare @startdate datetime = dateadd(hour, 7, @date);
Declare @enddate datetime = dateadd(hour, 26, @date);

select * 
from table
WHERE (cast(date as datetime) + cast(cast(time as time) as datetime)) 
BETWEEN @startdate AND @enddate

理想情况下,您应该将日期和时间列合并到单个DATETIME列中。话虽如此,以下几点应该起作用:

WITH testdata(Date, Time) AS (
    SELECT '2018-01-01', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 08:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 23:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 00:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 01:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 08:00:00' UNION
    SELECT CAST(NULL AS DATE), CAST(NULL AS DATETIME) -- type cast
)
SELECT *
FROM testdata
WHERE Date BETWEEN '2018-01-01' AND '2018-01-02'
AND (
    Date = '2018-01-01' AND Time >= '1754-01-01 07:00:00' OR 
    Date = '2018-01-02' AND Time <  '1754-01-01 07:00:00'
)

理想情况下,您应该将日期和时间列合并到单个DATETIME列中。话虽如此,以下几点应该起作用:

WITH testdata(Date, Time) AS (
    SELECT '2018-01-01', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 08:00:00' UNION
    SELECT '2018-01-01', '1754-01-01 23:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 00:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 01:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 06:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 07:00:00' UNION
    SELECT '2018-01-02', '1754-01-01 08:00:00' UNION
    SELECT CAST(NULL AS DATE), CAST(NULL AS DATETIME) -- type cast
)
SELECT *
FROM testdata
WHERE Date BETWEEN '2018-01-01' AND '2018-01-02'
AND (
    Date = '2018-01-01' AND Time >= '1754-01-01 07:00:00' OR 
    Date = '2018-01-02' AND Time <  '1754-01-01 07:00:00'
)

因为你的一天被第二天的两个小时抵消了,所以我会把你的约会时间往后拖两个小时

下面是一些示例/测试代码。select从输入@testdate datetime中减去2小时,然后将其截短到当天,将小时数截断

declare @testdate as datetime = '2018-01-01 10:15'
select cast(dateadd(hour,-2,@testdate) as date)

set @testdate = '2018-01-02 01:15'
select cast(dateadd(hour,-2,@testdate) as date)
两个select语句都返回

2018-01-01
如果单独存储日期和时间,请另外运行以下sql将它们合并

cast(Date as datetime) + cast(Time as datetime)
e、 g


因为你的一天被第二天的两个小时抵消了,所以我会把你的约会时间往后拖两个小时

下面是一些示例/测试代码。select从输入@testdate datetime中减去2小时,然后将其截短到当天,将小时数截断

declare @testdate as datetime = '2018-01-01 10:15'
select cast(dateadd(hour,-2,@testdate) as date)

set @testdate = '2018-01-02 01:15'
select cast(dateadd(hour,-2,@testdate) as date)
两个select语句都返回

2018-01-01
如果单独存储日期和时间,请另外运行以下sql将它们合并

cast(Date as datetime) + cast(Time as datetime)
e、 g



请指定日期和时间列的数据类型如果要存储相同事件的日期和时间,请将其存储为
datetime2
,而不是两个单独的列。日期和时间列的类型为“Data type”@Sequel3-恕我直言,否。如果您不是此系统的数据库管理员,询问他们这两列的数据类型
Data
在SQL中不是正确的数据类型。请指定日期和时间列的数据类型。如果要存储相同事件的日期和时间,请将其存储为
datetime2
而不是两个单独的列。日期和时间列的类型为“Data type”@Sequel3-敬重,否。如果您不是此系统的数据库管理员,请询问他们这两列的数据类型<代码>数据
在SQL中不是正确的数据类型。谢谢,如果我将日期列和时间列分开怎么办?日期列分为两个块,一个块表示日期,另一个块表示时间。如果是这样,我如何修改查询上述查询假设日期和时间存储在单独的列中。如果您有什么不明白的地方,请告诉我。此查询有点高级,但是我的日期列有时间,我的时间列也有时间。日期示例:2018-02-01 00:00:00.000 |时间示例:1754-01-01 21:32:38.477。如何运行我的查询?我相信您只需使用(…)删除
part并将testdata替换为表名:)对于任何日期,将
2018-01-01
2018-01-02
替换为该日期和该日期+1天。我假设时间列总是以
1754-01-01
开始,日期列总是以
00:00:00
结束。谢谢,如果我将日期列和时间列分开会怎么样?日期列分为两个块,一个块表示日期,另一个块表示时间。如果是这样,如何修改查询上述查询假设日期和时间存储在单独的列中。如果您有什么不明白的地方,请告诉我。此查询有点高级,但是我的日期列有时间,我的时间列也有时间。日期示例:2018-02-01 00:00:00.000 |时间示例:1754-01-01 21:32:38.477。如何运行我的查询?我相信您只需使用(…)删除
part并将testdata替换为表名:)对于任何日期,将
2018-01-01
2018-01-02
替换为该日期和该日期+1天。我假设时间列总是以
1754-01-01
开始,日期列总是以
00:00:00
结束。如果我在开始时使用Declare,表中的所有记录是否都会更改为“声明的日期”?不,不会。变量与表中的数据完全分离。查询只是将表中的日期与X+7小时和X+26小时的日期范围进行比较。在本例中,它将查看日期是否在2018年1月1日上午7点到2018年1月2日凌晨2点之间。如果我在开始时使用Declare,表中的所有记录是否会更改为“声明日期”?不,不会。变量与表中的数据完全分离。查询只是将表中的日期与X+7小时和X+26小时的日期范围进行比较。在本例中,它将查看日期是否为