我有一个查询,我想从数据为日期的列中选择数据。问题是数据是文本和日期的混合。
这个SQL位只返回最长的文本字段:
SELECT MAX(field_value)
日期确实发生时,格式始终为xx / xx / xxxx
我正在尝试选择最近的日期。
我正在使用MS SQL。
有人可以帮忙吗?
答案 0 :(得分:2)
SELECT MAX(CONVERT(DateTime, MaybeDate))
FROM (
SELECT MaybeDate
FROM MyTable
WHERE ISDATE(MaybeDate) = 1) T
您也可以使用MAX(CAST(MaybeDate AS DateTime))
。我在CONVERT
年之前就已经习惯了(也许是坏的)习惯,并坚持使用它。
答案 1 :(得分:0)
要在没有转换错误的情况下执行此操作:
select max(case when isdate(col) = 1 then cast(col as date) end) -- or use convert()
from . . .
SQL语句不指定操作顺序。因此,即使在子查询中包含where
子句,不也只能保证只转换日期。实际上,SQL Server优化器足够“智能”,可以在引入数据时进行转换,然后再进行过滤。
保证操作顺序的唯一操作是case
语句,甚至有例外。
答案 2 :(得分: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)。 因此,请使用适当的选项。