Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当列处于混合模式时,如何转换为varchar列到日期时间_Sql_Sql Server_Date_Type Conversion - Fatal编程技术网

Sql 当列处于混合模式时,如何转换为varchar列到日期时间

Sql 当列处于混合模式时,如何转换为varchar列到日期时间,sql,sql-server,date,type-conversion,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 我该怎么办

我在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先生,他正确地预测了这一点,在他的帮助下,我发现了错误。只有删除这些错误并用有效日期替换这些错误,才能达到目的

问候,,
Sadat

数据库中的日期格式(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)

数据库中的日期格式(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)

如果日期为dd/mm/yyyy格式,请重试

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

所有其他格式将显示为空

如果日期为dd/mm/yyyy格式,请重试

set dateformat dmy
select try_convert(datetime,date_col) from table
所有其他格式将显示为空

您可以尝试以下方法:

SELECT Original,
       case when left(Original,2) > 12 then convert(datetime, Original, 103)
            else convert(datetime, Original, 101) 
       end
from t1
您可以尝试以下方法:

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

根据您的评论,由于您确定列中的字符串格式(
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

根据您的评论,由于您确定列中的字符串格式(
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


你能给我们提供一些“通过”和“失败”的例子吗?长话短说,如果你能以yyyy-mm-dd格式获得varchar日期,转换应该会容易得多。dd/mm/yyyy不是很友好。。。我假设当你说“上传数据”时,你可以控制它。你说的“转换”是什么意思?通过查询或转换列数据类型?@chappoo:不确定如何将数据转换为yyyy-mm-dd。此外,我还需要通过查询转换而不是转换列数据类型。好的,谢谢您的澄清。忽略前面的评论。你能给我们提供一些“通过”和“失败”的示例吗?长话短说,如果你能以yyyy-mm-dd格式获得varchar日期,转换应该会容易得多。dd/mm/yyyy不是很友好。。。我假设当你说“上传数据”时,你可以控制它。你说的“转换”是什么意思?通过查询或转换列数据类型?@chappoo:不确定如何将数据转换为yyyy-mm-dd。此外,我还需要通过查询转换而不是转换列数据类型。好的,谢谢您的澄清。忽略前面的评论。它不起作用。说“对话失败”。这是由于列中存储的数据的混合模式造成的。我相信这是由于空值造成的。你能检查where子句中的空值吗?顺便问一下,这里的数据混合模式是什么??对不起,我真的没听明白。你有“dd/mm/yyyy”和其他格式吗???不是其他格式的数据,它们在视觉上看起来是相同的,即dd/mm/yyyy。但在列中,一些是日期格式,另一些是文本格式。但它显示以下错误:从字符串转换日期和/或时间时转换失败。它不起作用。说“对话失败”。这是由于列中存储的数据的混合模式造成的。我相信这是由于空值造成的。你能检查where子句中的空值吗?顺便问一下,这里的数据混合模式是什么??对不起,我真的没听明白。你有“dd/mm/yyyy”和其他格式吗???不是其他格式的数据,它们在视觉上看起来是相同的,即dd/mm/yyyy。但在列中,一些是日期格式,另一些是文本格式。但它显示以下错误:从字符串转换日期和/或时间时转换失败如下所示,我想将整个数据列转换为日期格式。如下所示,我想将整个数据列转换为日期格式。如何区分
11/12/2012
是12月11日还是11月12日?因此,如果前两位数字>12,您如何确定它是
MM
还是
dd
?如果是
yyyy-MM-dd
格式如何?@mucio:我使用了上面的代码,但它显示以下错误:将nvarchar值“0/”转换为数据类型int时,转换失败。当您处理这种情况下的不良数据质量时,最好的方法是请求更好的数据,否则您唯一能做的就是尽可能尝试转换。Sadat要求转换所有数据,最好的选择是在可能的情况下进行转换,并将格式错误的日期放在另一个表中,以将其发送回源系统(如果可能,否则处理)。回答你的问题:以2013年12月10日为日期,你如何决定哪一个是日、月还是年?正确的数据格式是为了避免这种歧义,如果数据质量不好,没有人可以假装miracles@SadatMainuddin当前位置我认为,如果不知道你在专栏中使用的所有不同类型的日期格式,任何人都无法为你提供答案。我认为你需要更新这个问题并提供更多细节。@Kaf:It