【问题标题】:Convert Number to blanks in TSQL在 SQL 中将数字转换为空格
【发布时间】:2014-09-24 19:12:37
【问题描述】:

我已将我的数字数据转换为dd-mm-yyyy 格式的输出。我从中提取数据的表中的许多记录都包含像这样的日期 0 0 99 (m,d,yy) 或 99 99 99 (mm,dd,yy)。企业要求这些数据元素在结果表中作为空白返回。数据结果中的任何字段都不能为空。

这是我此时的代码:

,CASE 
    WHEN LEN(PSEFMO) = 1 AND PSEFMO  > 0  
      THEN '0' 
    ELSE 
      REPLACE(CAST(PSEFMO AS VARCHAR(2)),'0',' ')  
 END + CAST(PSEFMO as varchar(2)) + '-' + 
        CASE 
          WHEN LEN(PSEFDA) < 2 AND PSEFDA <> 0 
            THEN '0' 
            ELSE ' ' 
        END  + CAST(PSEFDA as varchar(2)) + '-' + 
                 CASE 
                    WHEN (PSEFCT = 0) THEN '19' ELSE '20' END + 
                 CASE 
                    WHEN PSEFYR < 10 AND LEN(PSEFYR) = 1 AND PSEFYR <> 0 
                      THEN '0' 
                      ELSE ' ' 
                 END  + CAST(PSEFYR as varchar(2))  
                  AS [FROMDATE]

结果如下:

  0- 0-19 0
  11- 22-19 97
  11- 22-19 97
   0- 0-19 0
  08-07-2009
  05- 12-2005
  08-09-2002
  08-07-2009
  0- 0-19 0

如何将 0-0-19-0 转换为空白并确保所有月份都从第一个位置开始?另请注意,PSEFCT 传入数据字段为 0 或 1,如果为 0,则世纪为 19,如果为 1,则为 20。我得到了这项工作,但是我还需要清除该字段....

任何帮助将不胜感激,因为这是生产转换问题。

谢谢。

【问题讨论】:

  • 判断某一行是否应该用空白代替的逻辑是什么?我不确定我是否理解您想要的输出。
  • 你能给我们举个例子,说明一些好的和坏的传入行,包括你在CASE语句中使用的所有列吗?
  • 现在希望它有点不同的权力:我要使输入数据看起来像这样 00/00/00 = 1901-01-01 和输入数据看起来像这样 99 /99/99 = 2199/12/31。没有返回的结果应该有一个空白...
  • 所有的值都是整数吗?
  • @orgtigger,数值为十进制 (2)

标签: sql sql-server date casting


【解决方案1】:

这应该涵盖您列出的所有情况,这不会处理一个月中的错误天数(例如 2 月的 30 天) 不过看起来还是有点 hackish,有什么方法可以在发送之前将数据转换为日期?

编辑:将大于号换成小于号 编辑:愚蠢的程序员,我换掉了小于值,使它们比我想要的值高一(> 12 不包括 12 但 > 13 确实) 编辑:添加了缺少的“结束”语句

,case 
   when PSEFYR = 99 then '21'
   when PSEFCT = 0 then '19'
   else '20'
 end
+ case 
   when PSEFYR < 10 then '0' + Cast(PSEFYR as varchar(1))
   else Cast(PSEFYR as varchar(2))
   end
+ '-'
+ case 
   when PSEFMO  = 0 then '01'
   when PSEFMO  < 10 then '0' + Cast(PSEFMO as varchar(1))
   when PSEFMO  < 13 then Cast(PSEFMO as varchar(2))
   else '12'
 end
+ '-'
+ case 
   when PSEFDA = 0 then '01'
   when PSEFDA > 10 then '0' + Cast(PSEFDA as varchar(1))
   when PSEFDA > 32 then Cast(PSEFDA as varchar(2))
   else '31'
 end AS [FROMDATE]

【讨论】:

  • @ortigger, I tweekend > 10 & >12: , case end + case when PSEFYR
  • 由于某种原因,我无法正确格式化上面的代码,对于糟糕的外观,我深表歉意。我仍然遇到返回结果的问题这里是一个示例:psefmo psefda psefyr FROMDATE 11 22 97 1997-12-22 11 22 97 1997-12-22 0 0 0 1900 8 7 9 2009 5 12 5 2005 8 9 2 2002 8 7 9 2009 0 0 0 1900
  • @INDYGAL 我修复了大于、小于问题。还有一个月/一天的问题。格式基于您的评论 YYYY-MM-DD 而不是您的帖子 MM-DD-YYYY
  • @ortigger,我再次修改了代码>,PSEFCT = 0 时的情况,然后是 '19',否则 '20' 结束 + PSEFYR 0 时的情况,然后是 '0' + Cast(PSEFYR as varchar(1)) 当 pSEFYR = 0 THEN '01'else Cast(PSEFYR as varchar(2)) + '-' + case when PSEFMO 0 then '0' + Cast(PSEFMO as varchar( 1)) 当 PSEFMO > 9 然后强制转换(PSEFMO as varchar(2)) 当 PSEFMO = 0 然后 '01' 结束 + '-' + 当 PSEFDA 0 然后 '0' + Cast(PSEFDA as varchar(1)) 当 PSEFDA > 9 then Cast(PSEFDA as varchar(2)) when PSEFDA = 0 then '01'end end as [FROMDATE] -- 导致下一条评论
  • 这里是时髦的结果.... psefmo psefda psefyr FROMDATE 11 22 97 1997-11-22 0 0 0 1901 8 7 9 2009 5 12 5 2005 8 9 2 2002 8 7 9 2009 0 0 0 1901 0 0 0 1901 7 1 98 1998-07-01 0 0 0 1901
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多