标准化 sql server 中迄今为止不同格式的 varchar 字段

2024-04-08

我知道过去曾被问过类似的问题,但他们仍然没有为我的案例提供适当的解决方案。

我有一个数据库表(第三方),其中有varchar列为datetime value.

它包含以下格式的日期。

  11181980 
  8 18 1960 
  10/01/1960 
  04-12-1953 
  041371 
  7/29/44
  Empty String 
  NULL

当我选择此列时,我想以标准格式显示日期(例如mm/dd/yyyy) 可用时或为 NULL。

我只能想到一个函数来执行此操作,但我不想执行 UDF,因为我需要确保它在尝试转换时不会出错。 UDF 中没有 try/catch。我可以做一个 CLR 函数来利用更强大的 .net 功能,尽管我想避免它。

SQL Server 中有没有其他更好的方法来处理这种转换?另外,如果可能的话,我应该如何在 SQL 中进行此转换。


对于您描述的一组潜在格式:

DECLARE @x TABLE(y VARCHAR(32))

INSERT @x VALUES
('11181980'),
('8 18 1960'),
('10/01/1960'),
('04-12-1953'), 
('041371'),
('7/29/44'),
(''), 
(NULL);

SET DATEFORMAT MDY;

SELECT CONVERT(DATETIME, CASE WHEN y LIKE '%/%' THEN y
 WHEN LEN(RTRIM(y)) = 0 THEN NULL
 WHEN LEN(RTRIM(y)) IN (6,8) AND ISNUMERIC(y) = 1 THEN
 STUFF(STUFF(y,3,0,'/'),6,0,'/') END)
FROM (SELECT y = REPLACE(REPLACE(y, ' ', '/'), '-', '/') FROM @x) AS x;

这将解释7/29/44 as 2044, not 1944,基于服务器设置。要确保所有日期都是过去的日期,您可以执行以下操作:

SELECT y = DATEADD(YEAR, CASE WHEN y > GETDATE() THEN -100 ELSE 0 END, y) 
FROM
(
  SELECT y = CONVERT(DATETIME, CASE WHEN y LIKE '%/%' THEN y
   WHEN LEN(RTRIM(y)) = 0 THEN NULL ELSE
   STUFF(STUFF(y, 3, 0, '/'),6, 0, '/') END)
  FROM (SELECT y = REPLACE(REPLACE(y, ' ', '/'), '-', '/') FROM @x) AS x
) AS z;

这还取决于不存在不能被整理成日期的垃圾数据。到底是什么样的系统会输入这种不一致的废话呢?

在 SQL Server 2012 中您将能够使用尝试解析 http://msdn.microsoft.com/en-us/library/hh213126.aspx or 尝试转换 http://msdn.microsoft.com/en-us/library/hh230993.aspx但对于这些混乱的格式,您仍然需要进行一些调整才能获得有意义的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准化 sql server 中迄今为止不同格式的 varchar 字段 的相关文章

随机推荐