我有一个查询,我想从数据为日期的列中选择数据。问题是数据是文本和日期的混合体。
这段 SQL 只返回最长的文本字段:
SELECT MAX(field_value)
如果日期确实出现,则始终采用 xx/xx/xxxx 格式
我正在尝试选择最近的日期。
我正在使用 MS SQL。
任何人都可以帮忙吗?
我有一个查询,我想从数据为日期的列中选择数据。问题是数据是文本和日期的混合体。
这段 SQL 只返回最长的文本字段:
SELECT MAX(field_value)
如果日期确实出现,则始终采用 xx/xx/xxxx 格式
我正在尝试选择最近的日期。
我正在使用 MS SQL。
任何人都可以帮忙吗?
要做到这一点而不会出现转换错误:
select max(case when isdate(col) = 1 then cast(col as date) end) -- or use convert()
from . . .
SQL 语句没有指定操作的顺序。因此,即使where
在子查询中包含子句也不能保证只有日期被转换。事实上,SQL Server 优化器足够“聪明”,可以在引入数据时进行转换,然后再进行过滤。
唯一保证操作顺序的操作是case
语句,甚至还有例外。
另一种解决方案是在 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)。因此,请使用适当的选项。