如何将varchar列转换为列处于混合模式的datetime

时间:2013-10-31 10:49:25

标签: sql sql-server date type-conversion

我在sql server 2012中有一个列。该列的日期存储在varchar中。日期数据如下所示:dd / mm / yyyy

然而有一个问题。列中的数据是拒绝转换的。细节调查显示有些可转换为日期模式而其他则不可转换(可能是由于日期存储为文本模式)。我试图以日期格式上传数据。但它也拒绝这样做。

示例数据:

Original    Validation Check
10/03/1974  3/10/1974
02/02/1990  2/2/1990
16/05/1988  NULL

我该怎么办?

PS:发现存储在该列中的某些数据不是日期格式,因此它拒绝转换。感谢@Digvijay Verma先生,他正确地预测了它并在他的帮助下我发现了错误。只有删除这些错误并替换那些有效日期才能解决问题。

此致 萨达特

4 个答案:

答案 0 :(得分:2)

db(dd / mm / yyyy)中的日期格式为103。

所以你应该试试

SELECT convert(datetime, '31/10/2013', 103)

根据您的说明,您似乎需要yyyy-mm-dd格式的数据。所以请在下面试试。

SELECT convert(varchar(max),(convert(datetime, '31/10/2013', 103)), 120)

答案 1 :(得分:2)

根据您的评论,由于您确定列中的字符串格式(dd/mm/yyyy),我怀疑您的问题可能是由于前导/尾随空格

使用Ltrim()Rtrim()Isdate()函数尝试此操作。如果您在convertedDate字段中获得任何日期01/01/1900(假设此日期不在您的字段中),则您遇到的问题多于空格:

Select Original,
       Case when IsDate(Ltrim(Rtrim(Original))) = 1
            then Convert(date, Ltrim(Rtrim(Original)), 103)
            else Convert(date, '19000101', 112) --date in yyyymmdd format
       End ConvertedDate,
From yourTable

答案 2 :(得分:1)

如果日期采用dd / mm / yyyy格式,请尝试

set dateformat dmy
select try_convert(datetime,date_col) from table

所有其他格式将显示为NULL

答案 3 :(得分:0)

你可以试试这个:

SELECT Original,
       case when left(Original,2) > 12 then convert(datetime, Original, 103)
            else convert(datetime, Original, 101) 
       end
from t1

Here a small demo on SQLFiddle