【问题标题】:SQL Query for midnight transactions午夜事务的 SQL 查询
【发布时间】:2019-02-15 15:50:04
【问题描述】:

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

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 点才进行交易

【问题讨论】:

  • 请指定日期和时间列的数据类型
  • 如果您要存储相同事件的日期和时间,请将它们存储为 datetime2 而不是两个单独的列。
  • 日期和时间列的类型为“数据类型”
  • @Sequel3 - 尊敬的,不。如果您不是该系统的数据库管理员,请询问他们这两列是什么数据类型。 Data 不是 SQL 中正确的数据类型。

标签: sql sql-server date datetime time


【解决方案1】:

如果日期列有时间,那么就使用

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

【讨论】:

    【解决方案2】:

    如果您只想获取给定日期的交易,您可以在变量中声明日期,然后让查询搜索介于 (@date + 7 hours: 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
    

    这仅在您的日期列是日期时间数据类型时才有效。

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

    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
    

    【讨论】:

    • 如果我在开始时使用Declare,我在表格中的所有记录都会更改为“declared date”吗?
    • 不,他们不会。该变量与表中的数据完全分开。该查询只是将表中的日期与 X + 7 小时和 X + 26 小时的日期范围进行比较。在这种情况下,它将查看日期是否在 2018 年 1 月 1 日上午 7 点和 2018 年 2 月 1 日凌晨 2 点之间。
    【解决方案3】:

    理想情况下,您应该将日期和时间列合并到单个 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 |
    

    【讨论】:

    • 谢谢,如果我将日期和时间列分开怎么办?日期列有 2 个块,1 个块用于日期,另一个块用于时间。如果是,我该如何修改我的查询跨度>
    • 上述查询假定日期和时间存储在单独的列中。如果您有不明白的地方,请告诉我。
    • 这个查询有点高级,但是我的日期列有时间,我的时间列也有时间。日期示例:2018-02-01 00:00:00.000 |时间示例:1754-01-01 21:32:38.477.如何运行我的查询?
    • 我相信您只需删除 WITH (...) 部分并将 testdata 替换为您的表名:) 对于任何日期,将 2018-01-012018-01-02 替换为该日期和该日期 + 1 天.我假设时间列总是以1754-01-01 开头,而日期列总是以00:00:00 结尾。
    【解决方案4】:

    由于您的日期与第二天相差 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)
    

    两个选择语句都返回

    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)
    

    【讨论】:

      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2016-01-13
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多