1

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

* 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(不完全但接近)。

4

7 回答 7

5

= '2011-08-01'将仅匹配datetimes该日期的完全午夜(即您拥有的任何具有 值的行2011-08-01 00:00:00.00)。

进行查询的最佳方法是where exporteddate >= '20110801' and exporteddate < '20110802'

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

于 2011-09-23T19:19:15.300 回答
1

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

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

  1. 搜索一系列 DATETIME 值

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

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

于 2011-09-23T19:19:11.570 回答
0

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

于 2011-09-23T19:19:00.040 回答
0

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

于 2011-09-23T19:19:25.563 回答
0

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

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

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

但是,如您所见,可以使用 >、< 等检查日期是否相等。

于 2011-09-23T19:21:33.253 回答
0

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

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

于 2011-09-23T19:22:34.877 回答
0

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

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

CONVERT(VARCHAR,'2011-08-01',103);
于 2011-09-23T19:25:49.103 回答