【问题标题】:MS SQL DATABASE SEARCH BETWEEN 2 Dates and Times2 个日期和时间之间的 MS SQL 数据库搜索
【发布时间】:2014-08-21 13:04:24
【问题描述】:

我的表中有 2 列分别称为“日期”和“时间”。我想搜索从特定日期和时间到特定日期和时间的记录。我该怎么做?

两列的数据类型 nvarchar 日期格式 dd/mm/yy 时间格式 HH:mm:ss

我还传递了这些参数: 从日期 迄今为止 从时间 时间

【问题讨论】:

  • 数据类型也是DateTime吗?
  • 请发布您的列的数据类型!如果它们是 VARCHAR 或类似的,还要发布它们的存储格式 - 例如,我们是否正在查看 yyyy-mm-dd、mm/dd/yyyy 等。
  • 没有日期和时间列是 nvarchar(50)
  • 时间栏的格式是什么?这种信息非常适合作为对原始帖子的编辑(单击问题下方的“编辑”一词)而不是作为评论,因为它对查看问题的每个人都有用。
  • +1 用于响应和编辑您的问题以包含请求的信息!对于未来的问题,此类信息应包含在原始帖子中。有lots of places阅读如何提出一个好问题。

标签: sql-server


【解决方案1】:

为了它的乐趣(主要是因为我真的非常不喜欢尝试对错误的数据类型做这样的事情),你可以使用这样的 CAST() 函数(假设,无论你的数据类型是什么,它是可以将其转换为 DATETIME)。

已编辑以反映作为评论提及的数据类型/格式

DECLARE @MyTable TABLE (MyDate VARCHAR(50), MyTime VARCHAR(50))

INSERT INTO @MyTable (MyDate, MyTime) VALUES ('21/08/2014', '07:29:01')
INSERT INTO @MyTable (MyDate, MyTime) VALUES ('12/08/2014', '09:29:02')
INSERT INTO @MyTable (MyDate, MyTime) VALUES ('21/08/2014', '16:29:04')


SELECT CONVERT(DATETIME, MyDate,103) + CAST(MyTime AS DATETIME) FROM @MyTable
WHERE CONVERT(DATETIME, MyDate,103) + CAST(MyTime AS DATETIME) BETWEEN '8/21/2014' AND GETDATE()

再次编辑

上面的额外代码只是为了提供理论的演示,因为我无权访问您的源数据 - 将它应用到您的表格只会使用最后一部分,例如:

   SELECT *
   FROM WhateverYourTableIsNamed
   WHERE CONVERT(DATETIME, [Date],103) + CAST([Time] AS DATETIME) BETWEEN '8/21/2014 00:00:00.000' AND '8/21/2014 09:58:32.000'

【讨论】:

  • 比较时,这个日期格式是否需要mm/dd/yyyy?
  • CONVERT(DATETIME,MyDate,103) 中的 103 旨在考虑 dd/mm/yyyy 格式 - 请参阅 here。这会将列放入 SQL Server 的 DATETIME 数据类型中,这使得 BETWEEN 之类的事情变得容易得多。
【解决方案2】:

1 个提示。我会更改列名,因为它会导致另一个错误,因为 Date 可能是内置关键字。

也试试这个..

SELECT * 
FROM xxx 
WHERE dates >= '20121026' 
AND dates <  '20121028'    --- one day after 
                         --- it is converted to '2012-10-28 00:00:00.000'

;

【讨论】:

    【解决方案3】:

    SQL Fiddle:

    SELECT m.*
    FROM MyTable m
    WHERE CONVERT(Datetime, m.Date + ' ' + m.time, 120) 
          BETWEEN '2003/01/01 07:00:00' AND '2003/12/31 23:00:00';
    

    【讨论】:

    • 但是我的日期和时间列是 nvarchar(50) 数据类型..这行得通吗?
    • 日期格式怎么样,因为我与表格进行比较的日期格式是 dd/mm/yy?
    • SELECT * FROM MyTable m WHERE (CONVERT(DATE, m.Date, 103) BETWEEN fromdate AND todate) AND (CONVERT(TIME, m.time) BETWEEN fromtime AND totime)
    • 上面的代码只是比较时间而不是日期范围:(
    • 这个答案是错误的。它只会在 1 月 1 日至 12 月 31 日上午 7 点至晚上 11 点提供记录。它将排除同一日期范围内从晚上 11 点到早上 7 点的记录。 OP 正在查找从 1 月 1 日上午 7 点到 12 月 31 日晚上 11 点的所有记录。
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多