1

试图弄清楚如何让 SQL 读取一个值作为日期。

我有一个具有这样列的数据库:

id  created_at
1   2010-12-16
2   2010-12-16
3   2010-12-17
4   2010-12-21
5   2010-12-23
6   2011-01-04

我没有使用 SQL 创建表;它以文本形式生成并导入到 SQL 服务器。我不确定如何编写我的查询,以便它知道 created_at 是一个日期,所以我可以使用诸如“WHERE created_at <'2010-10-17' 等子句,就像我可以从普通 SQL 数据库中做的那样。 Cast 是去这里的路线吗?就像在 SELECT Cast(created_at as ...something?) 中一样,在其他地方找不到任何有用的东西。

4

2 回答 2

3
SELECT CAST (created_at as DATETIME) 

...应该给你你想要的价值。但是,如果您将它们作为 WHERE 子句的一部分进行转换,性能将会很差。您可能希望将另一个特定于日期的列添加到表中,例如“created_at_date”并将您的查询连接到它。

如果这不起作用并引发转换错误,则可能是因为列中的一个或多个值与您在上面显示的格式不一致。它可以是 NULL 或空白或只是垃圾格式。您最好的选择是添加像 JohnLBevan 这样的列,我都建议并尽可能多地转换。然后您可以查询未转换的项目。

另外,您是否考虑过生成数字表或日期表?

于 2012-08-02T21:21:26.347 回答
1

如果使用 SQL Server,您可以将列转换为您猜到的日期:

select cast(created_at as date) 
from myTable

select * 
from myTable 
where cast(created_at as date) >= '2012-01-01'

但是,每次查询表格时都需要这样做,这是非常低效的。最好重新定义表格以使该列默认为日期类型。如果您可以在此处发布您的表的 DDL 语句(用于创建表的 sql),我可以为您编写转换代码。或者,使用下面的代码在创建后更改表:

alter table myTable 
alter column created_at date

干杯,

JB

根据评论进行编辑。如果您无法更改数据类型并且它是 ntext 列,请先使用 substring 转换为 nvarchar,然后使用 cast 函数:

select * 
from myTable 
where cast(substring(created_at,1,10) as date) >= '2012-01-01'
于 2012-08-02T21:24:09.773 回答