Sql 将select语句中的字符串转换为日期

Sql 将select语句中的字符串转换为日期,sql,sql-server,date,Sql,Sql Server,Date,我有一个包含数据的列,但问题是该列的数据类型为varchar(50),由于某些原因,它必须是这样,现在我要做的是,在从表中选择数据时,我想将该列视为日期,以便在where子句中使用它。我使用下面的代码将其转换为日期,但它转换了一些值,然后给出了一个错误 这是我的样本数据 8/1/2002 6/9/2001 14/9/2001 26/7/2001 14/12/2001 21/1/2002 29/4/2001 7/5/2001 9/11/2001 16/7/2001 select CONVERT

我有一个包含数据的列,但问题是该列的数据类型为varchar(50),由于某些原因,它必须是这样,现在我要做的是,在从表中选择数据时,我想将该列视为日期,以便在where子句中使用它。我使用下面的代码将其转换为日期,但它转换了一些值,然后给出了一个错误 这是我的样本数据

8/1/2002
6/9/2001
14/9/2001
26/7/2001
14/12/2001
21/1/2002
29/4/2001
7/5/2001
9/11/2001
16/7/2001


select CONVERT(date,sowingDate,103) from tblAgriculture_staging
我试过日期格式的不同版本,如103105等

但它仍然会转换某些值,但某些值出现错误,查询执行会停止,请尝试以下操作:

SET DATEFORMAT dmy;
select case when isdate(sowingDate) = 1 then CONVERT(date,sowingDate,103) end [date] from tblAgriculture_staging
或者(如果您使用的是sql 2012)

但此解决方案隐藏(转换为NULL)所有错误的日期。您可以先反转条件,查找/修复日期不正确(即2013年2月31日)的所有行,然后使用此查询仅显示有效日期

试试这个:

SET DATEFORMAT dmy;
select case when isdate(sowingDate) = 1 then CONVERT(date,sowingDate,103) end [date] from tblAgriculture_staging
或者(如果您使用的是sql 2012)

但此解决方案隐藏(转换为NULL)所有错误的日期。您可以先反转条件,查找/修复日期不正确(即2013年2月31日)的所有行,然后使用此查询仅显示有效日期

但它转换了一些值,然后给出了一个错误。这是我的示例 资料

因为某些数据格式无效或包含不正确的符号。
试试这个:

select CONVERT(date,ltrim(rtrim(sowingDate)), 103) from tblAgriculture_staging
或者检查您的价值观:

select ISDATE(sowingDate) as IsDate, sowingDate, CASE WHEN ISDATE(sowingDate)=1 THEN CONVERT(date,ltrim(rtrim(sowingDate)), 103) ELSE NULL END from tblAgriculture_staging
但它转换了一些值,然后给出了一个错误。这是我的示例 资料

因为某些数据格式无效或包含不正确的符号。
试试这个:

select CONVERT(date,ltrim(rtrim(sowingDate)), 103) from tblAgriculture_staging
或者检查您的价值观:

select ISDATE(sowingDate) as IsDate, sowingDate, CASE WHEN ISDATE(sowingDate)=1 THEN CONVERT(date,ltrim(rtrim(sowingDate)), 103) ELSE NULL END from tblAgriculture_staging

这将返回所有不是实际日期的日期

select sowingDate from tblAgriculture_staging where isdate(sowingDate)=0

这将返回所有不是实际日期的日期

select sowingDate from tblAgriculture_staging where isdate(sowingDate)=0

这有点糟糕,但将日期存储为varchar也是如此

这是一个代码,在过去我有一些日期是4位数的年份,一些日期是2位数的年份

 where  (TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),1)>=@From
            AND TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),1)<=@To)
        OR (TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),101)>=@From
            AND TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),101)<=@To)
where(尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),1)>=@From
然后尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),1)=@From

然后尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),101)这有点糟糕,但将日期存储为varchar也是如此

这是一个代码,在过去我有一些日期是4位数的年份,一些日期是2位数的年份

 where  (TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),1)>=@From
            AND TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),1)<=@To)
        OR (TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),101)>=@From
            AND TRY_CONVERT(Datetime2,LTRIM(RTRIM([INVC DTE])),101)<=@To)
where(尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),1)>=@From
然后尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),1)=@From


并尝试转换(Datetime2,LTRIM(RTRIM([INVC DTE])),101)您得到的错误是什么?您尝试的是哪个sql server版本?在哪些值上失败?这意味着您的日期表示无效。数据中是否有2位数的年份?请检查我的答案以检查您的数据它将在这些日期起作用2002年8月1日6/9/2001您得到的错误是什么?您尝试的是哪个sql server版本?在w上它失败了吗?这意味着您的日期表示无效。数据中是否有2位数的年份?请检查我的答案以检查您的数据它将在这些日期工作8/1/2002 6/9/2001
ISDATE('14/12/2001')
返回
0
转换(日期,'14/12/2001',103)
工作正常。您可以通过定义SET-DATEFORMAT dmy来更改此设置;很公平,只需将此添加到您的答案中,我将删除下一票。您还应指定OP可能会找出数据误差,并尝试解决问题,而不是编写异常代码。您好,您的答案有效,但我想知道它是否有效我将为这些日期工作dd/mm/yyyy、d/m/yyyy、dd/m/yyyy、d/m/yyyy?请注意,所有日期都是正确的,格式为天/月/年
ISDATE('14/12/2001')
返回
0
,而
转换(日期,'14/12/2001',103)
工作正常。您可以通过定义SET-DATEFORMAT dmy来更改此设置;很公平,只需将此添加到您的答案中,我将删除下一票。您还应指定OP可能会找出数据误差,并尝试解决问题,而不是编写异常代码。您好,您的答案有效,但我想知道它是否有效请注意,所有日期都是正确的,格式为天/月/年。我的第四个答案没有响应。@user2539602最后一个查询返回什么?糟糕的一天。我的第四个答案没有响应。我的第四个答案没有响应。@user2539602最后一个查询返回什么?糟糕的一天。我的第四个答案没有响应。@user2539602最后一个查询返回什么?嗨,我的日期是dd/mm/yyyy或d/我的日期为dd/mm/yyyy或d/mm/yyyy或d/m/yyyy或d/mm/yyyy或dd/m/yyyy 2011年9月14日将此日期返回为假