在select语句中将String转换为date

时间:2013-11-13 14:56:54

标签: 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(date,sowingDate,103) from tblAgriculture_staging

我已经尝试了不同版本的日期格式,例如103,105等

但仍会转换某些值,但某些值会出现错误并且查询执行会停止

4 个答案:

答案 0 :(得分:1)

试试这个:

SET DATEFORMAT dmy;
select case when isdate(sowingDate) = 1 then CONVERT(date,sowingDate,103) end [date] from tblAgriculture_staging

或(如果您使用的是sql 2012)

SET DATEFORMAT dmy;
select case when TRY_CONVERT(date, sowingDate) IS NOT NULL then CONVERT(date,sowingDate,103) end [date] from tblAgriculture_staging

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

SQLFiddle

答案 1 :(得分:0)

  

但它转换了一些值,然后给出错误,这是我的样本   数据

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

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

答案 2 :(得分:0)

这将返回所有不是日期的日期。

select sowingDate from tblAgriculture_staging where isdate(sowingDate)=0

答案 3 :(得分: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)

SQL Server 2012 + Only

这假设您已清理了实际上不是日期的任何内容......