将Char字段转换为DateTime,但仅当该字段包含格式为dd/mm/yyyy-Sql Server 2005的日期时才进行转换
我有一张桌子:将Char字段转换为DateTime,但仅当该字段包含格式为dd/mm/yyyy-Sql Server 2005的日期时才进行转换,sql,sql-server-2005,datetime,Sql,Sql Server 2005,Datetime,我有一张桌子: Comments(Id int-identity主键,PersonId int(6),Comment1字符(60)) 字段Comment1应仅包含非重要注释,,但该字段已用于存储非重要注释,以及dd/mm/yyyy格式的重要日期 例如,表中的数据如下所示: * Id * PersonId * Comment1 * | 1 | 5 | Likes Chocolate | | 2 | 5 | 19/05/1992 | | 3
Comments(Id int-identity主键,PersonId int(6),Comment1字符(60))
字段Comment1
应仅包含非重要注释,,但该字段已用于存储非重要注释,以及dd/mm/yyyy格式的重要日期
例如,表中的数据如下所示:
* Id * PersonId * Comment1 *
| 1 | 5 | Likes Chocolate |
| 2 | 5 | 19/05/1992 |
| 3 | 5 | 23/07/1999 |
| 4 | 5 | 05/06/1994 |
| 5 | 8 | 07/12/1998 |
| 6 | 8 | Is very Tall |
| 7 | 8 | 24/05/1995 |
| 8 | 8 | 16/10/2002 |
| 9 | 11 | 13/11/2005 |
| 10 | 11 | 21/09/2000 |
| 11 | 11 | 8/99/100/23-1 |
他们现在需要在Comment1
字段中为每个人找到包含最近日期的一行
首先,我尝试使用以下查询删除那些不包含有效日期的行:
Select
Id,
PersonId,
Case
When IsDate(Comment1) = 1
Then convert(date, cast(rtrim(Comment1) as nvarchar), 103)
Else NULL
End
From Comments
但这只让我回过神来:
* Id * PersonId * Comment1 *
| 4 | 5 | 1994-06-05 |
| 5 | 8 | 1998-12-07 |
其他行为(null)
。这可以在sqlfiddle链接中看到
谁能告诉我哪里出了问题
一旦这个select语句返回了我需要的内容,我希望我能够使用聚合函数按照PersonId返回最近的日期。使用
使用
FYI,您的case表达式中不需要
Else NULL
,任何在您的案例中未处理的内容都将返回NULL。无法保证它不会尝试CAST()
,即使ISDATE()
返回0,它也可以重新安排操作。因此,您需要将其拆分为两个查询(一个筛选步骤和一个比较步骤),并在这两个查询之间使用临时表或变量。还可以使用CONVERT()
传递适当的格式值。ISDATE的返回值取决于set-DATEFORMAT、set-LANGUAGE和Configure-The-default-LANGUAGE服务器配置选项所设置的设置。@Bridge谢谢,我不是100%肯定会这样。@Damien\u不信者我会记住这一点,我可能会走临时桌路线。关于使用Convert()
而不是Cast()
,我可以从日期、货币值等方面理解这一点。但是当将Char
转换为nVarChar
时,我需要什么格式值?感谢您,在您的case表达式中不需要Else NULL
,任何在您的案例中未处理的内容都将返回NULL。无法保证它不会尝试CAST()
,即使ISDATE()
返回0,它也可以重新安排操作。因此,您需要将其拆分为两个查询(一个筛选步骤和一个比较步骤),并在这两个查询之间使用临时表或变量。还可以使用CONVERT()
传递适当的格式值。ISDATE的返回值取决于set-DATEFORMAT、set-LANGUAGE和Configure-The-default-LANGUAGE服务器配置选项所设置的设置。@Bridge谢谢,我不是100%肯定会这样。@Damien\u不信者我会记住这一点,我可能会走临时桌路线。关于使用Convert()
而不是Cast()
,我可以从日期、货币值等方面理解这一点。但是当将Char
转换为nVarChar
时,我需要什么格式值?谢谢
set dateformat dmy
Select
Id,
PersonId,
Case
When IsDate(Comment1) = 1
Then convert(date, cast(rtrim(Comment1) as nvarchar), 103)
Else NULL
End
From Comments