与“转换”功能一起使用时,where子句失败

时间:2019-03-27 22:43:50

标签: sql sql-server tsql type-conversion where

我正在将表示日期的varchar字段转换为datetime,并将其与"where - between"子句一起使用。

我得到:

  

从字符转换日期和/或时间时转换失败   字符串

我的where子句是:

select
screen_date
from d8003
where convert(datetime, screen_date, 120) between '6/1/2018' and '12/31/2018'

如何解决此问题?

4 个答案:

答案 0 :(得分:1)

尝试使用以下语法(使用YYYYMMDD日期格式,而不是MM / DD / YYYY):

public void search(String searchQuery, String searchType){

            page.enterSearchBarText(searchQuery);
            if(searchType.equalsIgnoreCase("enter"){
                page.pressEnter();
            }else {
                page.clickSearchButton();
            }
            //wait For SearchResult to present
        }

如果仍然出现相同的错误,请检查您是否使用了正确的日期格式代码:

答案 1 :(得分:0)

2005年前的错误处理能力非常有限。 对于SQL 2005+,应该可以使用

declare 
     @date_value varchar(50)
    ,@tmp datetime;
declare x cursor local fast_forward 
for
select screen_date from d8003

open x;
fetch next from x into @date_value;
while @@fetch_status = 0
    begin
        begin try
            set @tmp = convert(datetime,@date_value, 120)
        end try
        begin catch
            select 'This one is bad! Please fix me!! (' + rtrim(@date_value) + ')' bad_values;
        end catch
        fetch next from x into @date_value;
    end
close x;
deallocate x;
GO

这将在SQL 2012+中返回您的错误数据 try_convert,将对不可转换的字符串返回null。

select 
    try_convert(datetime, screen_date, 120) mytryconvert
    ,screen_date
from d8003
where try_convert(datetime, screen_date, 120) is null

您可以手动更正数据或通过字符串操作内联。

答案 2 :(得分:0)

如果不确定是否可以实际转换该值,请使用TRY_CAST

但是请注意,您收到此错误的事实可能表明您的列中的某些记录存在问题。仅在只关心获取varchar列可以实际转换为日期时间的记录时才使用TRY_CAST。

SELECT
    [screen_date]
FROM
    [d8003]
WHERE
    TRY_CAST([screen_date] AS DATETIME) BETWEEN '6/1/2018' AND '12/31/2018'

答案 3 :(得分:0)

感谢您提供的所有建议和帮助。很高兴告诉您,我找到了解决方案。这是我的代码:

其中try_cast(screen_date为smalldatetime)介于“ 2018-06-01”和“ 2018-12-31”之间

这是一个有多年经验的同事的建议。 (我刚刚开始用SQL编写代码...。)

这是先前一个人的建议,我不确定为什么当时不起作用。

Deguza