1

我有一个查询,我想从数据为日期的列中选择数据。问题是数据是文本和日期的混合体。

这段 SQL 只返回最长的文本字段:

SELECT MAX(field_value)

如果日期确实出现,则始终采用 xx/xx/xxxx 格式

我正在尝试选择最近的日期。

我正在使用 MS SQL。

任何人都可以帮忙吗?

4

3 回答 3

2

尝试使用ISDATEand CONVERT

SELECT MAX(CONVERT(DateTime, MaybeDate))
FROM (
  SELECT MaybeDate
  FROM MyTable
  WHERE ISDATE(MaybeDate) = 1) T

你也可以使用MAX(CAST(MaybeDate AS DateTime)). 我养成了CONVERT多年前使用的(也许是坏的?)习惯,并且一直坚持下去。

于 2013-06-10T11:29:01.030 回答
0

要做到这一点而不会出现转换错误:

select max(case when isdate(col) = 1 then cast(col as date) end)  -- or use convert()
from . . .

SQL 语句没有指定操作的顺序。因此,即使where在子查询中包含子句也不能保证只有日期被转换。事实上,SQL Server 优化器足够“聪明”,可以在引入数据时进行转换,然后再进行过滤。

唯一保证操作顺序的操作是case语句,甚至还有例外。

于 2013-06-10T11:30:41.240 回答
0

另一种解决方案是在 WHERE 子句中使用 PATINDEX。

SELECT PATINDEX('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', field_value)

这种方法的问题是你真的不确定某事是否是日期(例如 99/99/9999 不是日期)。IS_DATE 的问题在于它取决于配置(例如 DATEFORMAT)。因此,请使用适当的选项。

于 2013-06-10T11:44:39.630 回答