我有一个包含数据的列,但问题是此列的数据类型为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等
但仍会转换某些值,但某些值会出现错误并且查询执行会停止
答案 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),然后使用此查询仅显示有效日期
答案 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
这假设您已清理了实际上不是日期的任何内容......