SQL查询午夜交易

时间:2018-09-11 07:32:34

标签: sql sql-server date datetime time

我使用什么查询来获取包括午夜(过去的午夜)在内的交易。例如:

2018年1月1日

我们的百货公司每天从早上7点至下午2点(第二天)营业 因此,凌晨2点的交易被视为“ 2018年1月1日”的交易

这是我的查询

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' 

目前,我的查询只接受交易,直到11:59:59 但是我们的商店营业到深夜 我想每天交易到凌晨2点

4 个答案:

答案 0 :(得分:2)

理想情况下,您应该在单个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'
)

为完整性起见,我将包括上午7:00至前一天的所有交易。结果:

| Date       | Time                    |
|------------|-------------------------|
| 2018-01-01 | 1754-01-01 07:00:00.000 |
| 2018-01-01 | 1754-01-01 08:00:00.000 |
| 2018-01-01 | 1754-01-01 23:00:00.000 |
| 2018-01-02 | 1754-01-01 00:00:00.000 |
| 2018-01-02 | 1754-01-01 01:00:00.000 |
| 2018-01-02 | 1754-01-01 06:00:00.000 |

答案 1 :(得分:0)

如果日期列中有时间,则只需使用

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

答案 2 :(得分:0)

如果只想获取给定日期的交易,则可以在变量中声明日期,然后让查询搜索介于(@date + 7小时:7 am)和(@date + 26之间的记录小时:第二天凌晨2点),您可以使用dateadd函数进行操作。为了简单起见,我还声明了变量的开始日期和结束日期。

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

答案 3 :(得分:0)

由于您的日期从第二天起偏移了2个小时,因此我将您的日期推迟了2个小时。

这是一些示例/测试代码。选择项从输入的@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)

例如

select cast(dateadd(hour,-2,cast(Date as datetime) + cast(Time as datetime)) as date)