Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Char字段转换为DateTime,但仅当该字段包含格式为dd/mm/yyyy-Sql Server 2005的日期时才进行转换_Sql_Sql Server 2005_Datetime - Fatal编程技术网

将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