SQL 不根据确切日期提取记录

Posted

技术标签:

【中文标题】SQL 不根据确切日期提取记录【英文标题】:SQL does not pull records based on exact date 【发布时间】:2011-09-23 19:17:01 【问题描述】:

我导出了记录,我想知道在特定日期导出了哪条记录。这没用。这是我查询的数据。

* comapny Name *     * date exported *
ABC Company, Inc    2011-08-01 15:44:52.857
XYZ Company, Inc    2011-08-01 15:44:52.857

我发出这个命令,它不检索完全匹配

select companyname, exporteddate from mytable exporteddate = '2011-08-01' <- does not work
select companyname, exporteddate from mytable exporteddate like '%2011-08-01%' <-- tried this variation too and many other, did not work

有趣的是 >=, >,

select companyname, exporteddate from mytable exporteddate >= '2011-08-01' <- this works

我使用的是 Windows XP、MS-SQL 2005 SP3(不完全是,但很接近)。

【问题讨论】:

【参考方案1】:

= '2011-08-01' 只会匹配该日期恰好午夜的 datetimes(即您拥有的任何具有 2011-08-01 00:00:00.00 值的行)。

查询的最佳方式是where exporteddate &gt;= '20110801' and exporteddate &lt; '20110802'

这是 sargable,避免了模棱两可的 datetime 格式,并且比在 20110801 23:59:59.997 上具有结束条件的 BETWEEN 替代方案更好,因为它依赖于有关将中断的 datetime 数据类型的最大精度的实现细节如果您在稍后的某个阶段转移到新的 SQL Server 2008 datetime2 数据类型。

【讨论】:

第二个条件不应该是严格的&lt;比较吗?:and exporteddate &lt; '20110802'【参考方案2】:

您的问题是您使用 DATETIME 字段来存储 DATE。如您所见,数据实际上存储到毫秒级。

要使其正常工作,您可以:

    搜索一系列 DATETIME 值

    WHERE exporteddate BETWEEN '2011-08-01 00:00:00.000' AND '2011-08-01 23:59:59.999'

    将存储从 DATETIME 转换为 DATE(如果您真的不需要区分单个日期的多个负载,这是最简单的解决方案)。

【讨论】:

23:59:59.999 不起作用。这得到了四舍五入。 datetime 的最大精度是每秒 300 个滴答声,所以 SELECT cast('2011-08-01 23:59:59.999' as datetime) 给出 2011-08-02 00:00:00.000 抱歉,完全想到了另一个引擎(以及它们的 DEXTRACT 函数)。我曾将 CAST 视为 DATE,但是根据 Martin 的说法,SQL Server 2005 中没有 DATE 类型,因此不可用。你坚持范围搜索。【参考方案3】:

未指定时间的日期时间字段被解释为时间为 00:00:00 的日期。

【讨论】:

【参考方案4】:

除非您指定,否则时间部分将恰好是 00:00:00,因此您的时间戳中的所有秒数都将阻止完全匹配。

【讨论】:

【参考方案5】:

日期字段不像文本字段那样工作。

您的第一个非工作选择不包括时间(在数据中)。您需要截断日期或使用只有年/月/日的格式将其转换为字符串。

LIKE 语句也是如此。它不是文本字段。

但是,如您所见,可以使用 >、

【讨论】:

【参考方案6】:

像许多其他建议一样,因为您不提供时间,SQL 将使用 00:00:00 代替。要将 DATE 与 DATEIME 进行比较,您可以将 DATETIME 转换为 DATE。

我不知道如何在 SQL 服务器中实现这一点,但在 mysql 中它会是:select companyname,exporteddate from mytable DATE(exporteddate) = '2011-08-01'

【讨论】:

【参考方案7】:

试试这个,您正在将两个日期转换为相同的格式并将它们合并。

select companyname, exporteddate from mytable  CONVERT(VARCHAR,exporteddate ,103)= 

CONVERT(VARCHAR,'2011-08-01',103);

【讨论】:

以上是关于SQL 不根据确切日期提取记录的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 根据与其他记录的日期和时间差过滤记录

使用sql根据日期差异选择记录

如何使用活动记录查询sql以获取指定时间之间的日期

从 MySQL 中根据日期选择记录

SQL 根据当前日期减去两天选择记录

SQL:根据最近的日期选择一个字段中的值是唯一的记录