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 SERVER:如何保留;“日期格式”;在“将VARCHAR转换为具有多种日期格式的日期”中_Sql_Sql Server_Date_Datetime Format_Sql Convert - Fatal编程技术网

SQL SERVER:如何保留;“日期格式”;在“将VARCHAR转换为具有多种日期格式的日期”中

SQL SERVER:如何保留;“日期格式”;在“将VARCHAR转换为具有多种日期格式的日期”中,sql,sql-server,date,datetime-format,sql-convert,Sql,Sql Server,Date,Datetime Format,Sql Convert,我有几个varchar(max)类型的列,它们要么有日期数据,要么有日期时间数据。我想将它们转换为日期类型,我知道我应该使用convert函数。到这里没问题 我手头的问题是,存储在每列中的日期并不是来自类似的日期格式类型;不跨列,甚至不在一列内。换句话说,列中的日期格式不一致。一列中的某些日期可能如下所示: DDMMMYYYY 年月日 年月日 使用convert(不指定日期样式)将最终创建疯狂的输出 我需要一个脚本,将这些varchar转换为日期,保留原始格式。 我知道SET DATEFO

我有几个varchar(max)类型的列,它们要么有日期数据,要么有日期时间数据。我想将它们转换为日期类型,我知道我应该使用convert函数。到这里没问题

我手头的问题是,存储在每列中的日期并不是来自类似的日期格式类型;不跨列,甚至不在一列内。换句话说,列中的日期格式不一致。一列中的某些日期可能如下所示:


DDMMMYYYY

年月日

年月日


使用convert(不指定日期样式)将最终创建疯狂的输出

我需要一个脚本,将这些varchar转换为日期,保留原始格式。


我知道SET DATEFORMAT函数;是否有获取DATEFORMAT的反向函数?是否有方法检测日期格式样式?

SQL Server日期数据类型没有“格式”。日期是一个4字节的二进制结构,显示格式完全由呈现数据的客户端应用程序控制

可以将未分离的DDMMYYYY值可靠地解析为日期,因为字符串上的日期组件是已知的。但是,在日组件小于13的情况下,DD/MM/YYYY和MM/DD/YYYY是不明确的。

如果使用的是SQL Server 2012或更高版本,则可以使用该功能。您可以使用文档中定义的样式

例如,这将转换表中日期为MM/DD/yyyyy格式(101)的每个值,该日期可能为DD/MM/yyyyy格式(105),但不含糊:

这将转换DDMMMYYYY格式的每个值(106最接近):

然而,这:

我需要一个脚本,将这些varchar转换为日期,保留原始格式。

这是一个荒谬的要求。日期和时间数据类型不会与任何显示格式信息一起保存。它们以二进制格式保存为日期、时间、日期时间等数据类型。如果将该值保留为datetime,则由客户机确定日期的显示方式。从SSMS运行
SELECT getdate()
时,由SSMS决定显示格式。
SQL Server可以通过使用
CONVERT()
函数或
FORMAT()
函数将字段转换为varchar来完成格式化。但是,通常情况下,最好在应用程序中设置日期格式,就像使用货币一样。

如果输入日期可能是DD/MM/YYYY或MM/DD/YYYY,您如何判断2017年2月1日是指2017年1月2日还是2017年2月1日?没有不明确的日期格式的解决方案。停止在varchar存储日期,您就不会遇到此问题。否则,您将继续感到头痛,并将不断遇到无法解决的情况,就像您在这里遇到的情况一样。我理解这些不明确的情况,我有一个解决方法(与一行中的其他日期字段进行比较)。我无法控制数据创建过程,这就是它。输入是一个varchar,因此它是格式化的。我理解模棱两可的情况;但我可能会根据最后一个已知的(明确的)案例对其进行分析。我不明白您指的是什么时候根据最后一个已知的明确案例分析不明确的格式。我有另一个日期列,它存储的日期值相同,但格式不同。我可以比较这两个值,并确保它们agree@MeysaM,如果您有两个日期的值应该相同,则该方法应该有效。如果您需要这方面的帮助,请将这些详细信息添加到问题中,并为您正在使用的特定SQL Server版本添加标记。
SELECT TRY_CONVERT(date, VarcharColumn, 101)
FROM UnnamedTable
WHERE TRY_CONVERT(date, VarcharColumn, 101) IS NOT NULL
    AND TRY_CONVERT(date, REPLACE(VarcharColumn,'/','-'), 105) IS NULL
SELECT TRY_CONVERT(date, SUBSTRING(VarcharColumn,1,2) + ' ' + SUBSTRING(VarcharColumn,3,3) + ' ' + SUBSTRING(VarcharColumn,5,4), 106)
FROM UnnamedTable
WHERE TRY_CONVERT(date, SUBSTRING(VarcharColumn,1,2) + ' ' + SUBSTRING(VarcharColumn,3,3) + ' ' + SUBSTRING(VarcharColumn,5,4), 106) IS NOT NULL