【发布时间】:2020-08-28 22:16:40
【问题描述】:
我正在尝试从名为 Date_of_Pay 的列中过滤日期(在 db 工具中使用 alteryx),该列当前是格式为 mm/dd/yyyy 的字符串。我尝试了以下方法:
select table.*
from table
where cast(Date_of_Pay AS date) >= '20140101' AND cast(Date_of_Pay AS date) <= '20141231'
-- alternatively I have tried
-- where convert(date, Date_of_Pay, 101) >= '20140101' AND convert(date, Date_of_Pay, 101) <= '20141231'
我得到一个错误:
错误读取记录:Microsoft OLE DB Provider for SQL Server:从字符串转换日期和/或时间时转换失败。
我还比较了字符串01/01/2014 和许多其他组合,似乎找不到正确的方法。上述两种方式都适用于一张桌子,但不适用于稍后将与之联合的另一张桌子。我在想第二张表中的数据可能有问题,但我希望有人可能有更多的见解。
【问题讨论】:
-
您必须向我们展示一些示例数据,以便我们提供任何见解。但是,有大量关于将日期转换为字符串和从字符串转换的信息……您不必看得很远就能找到所需的内容。官方文档总是一个很好的起点。就像将日期存储为日期数据类型而不是字符串一样。
-
另外,Alteryx 真的是这个问题的相关标签吗?
-
日期和时间数据类型没有格式,因此不能存储在一个中;它们存储为二进制值。 如果您将存储为
varchar,但是,您有一个大问题,需要修复您的设计。将日期存储为date,没有更好的数据类型,varchar是迄今为止最差的。我可以向您保证,2010 年 1 月 4 日不是在 2020 年 12 月 1 日之后,而是根据您描述的数据。 -
@kakas11 你没有显示 actual 数据,你创建了一个小的测试查询来演示这个问题。无论如何,只要您不包含敏感的列,您最感兴趣的是几乎不是敏感信息的日期列。
-
@kakas11,你不能修改表是有道理的。但是,这里的一种解决方法是尝试重现创建示例表(在您可以使用的数据库中)的问题,并使用确切的列类型作为相关数据。上面其他评论者关于查看有关数据库数据类型的技术文档的建议也是一个好主意。此外,您将此标记为“Alteryx”问题......数据是存储在 Alteryx 中还是在那里显示/报告?
标签: sql sql-server tsql date alteryx