【问题标题】:Convert YYMDD into normal date将 YYMDD 转换为普通日期
【发布时间】:2012-12-17 10:06:04
【问题描述】:

我有字符串'12B17T',它正好代表YYMDDAA 是一个不相关的属性)。 对于月份,1-9 用于一月至九月; A-C 用于 10 月、11 月和 12 月

string 的大小是固定的(例如,如果日期是 2012 年 1 月 1 日,它看起来像 '12101T'

我如何使用 SQL 从中获得类似 17.11.2012 的信息?

【问题讨论】:

  • 12 是年(假设每年都是 20YY 所以 12 -> 2012,13 -> 2013),1 代表 1 月,01 代表第一天,T 无关
  • 哎呀,按原样打那个最初形成日期的人。在 sql 查询中将这些字段值解码/转换为正常日期非常难看。更好地使用/编写存储过程,获取列并返回日期。

标签: sql sql-server


【解决方案1】:

试试这个;

DECLARE @x varchar(50)= '12B17T' 
SELECT  SUBSTRING(@x,4,2) +'-'+ 
   RIGHT( '0' + CASE SUBSTRING(@x,3,1) WHEN 'A' THEN '10'
                          WHEN 'B' THEN '11'
                          WHEN 'C' THEN '12' 
   ELSE SUBSTRING(@x,3,1) END, 2) +'-'+ 
   '20' + SUBSTRING(@x,1,2)

SQL Demo Fiddle here

--Results 17-11-2012        

【讨论】:

  • @MahmoudGamal,谢谢。我刚刚添加了RIGHT('0' + ..,2) 来掩盖当月的两位数。
  • 非常感谢您的快速回复。这正是我想要的。
  • 您的日期和年份值是倒数的。初始格式为YYMDD 而不是DDMYY
  • 我注意到了,但这只是装饰性的东西。
【解决方案2】:

这可能是一种丑陋的方法,但我会创建一个函数,您可以在查询中调用它来转换数据:

create function TransformDate(@myString varchar(6))
returns datetime
as
begin

  return cast('20'+left(@myString, 2) +'-'
    + case substring(@mystring, 3, 1)
        when '1' then '01'
        when '2' then '02'
        when '3' then '03'
        when '4' then '04'
        when '5' then '05'
        when '6' then '06'
        when '7' then '07'
        when '8' then '09'
        when '9' then '09'
        when 'A' then '10'
        when 'B' then '11'
        when 'C' then '12' end +'-'
    + substring(@mystring, 4, 2) as datetime)

end

那么你可以这样使用它:

declare @value varchar(6) = '12B17T'

select dbo.transformdate(@value) as dt

SQL Fiddle with Demo

这会导致:

|         DT |
--------------
| 2012-11-17 |

【讨论】:

    【解决方案3】:

    如果您的服务器以这种格式识别月份,您可以尝试:

    SELECT TO_CHAR(t_date,'YYYY.MM.DD') FROM (SELECT TO_DATE(some_date,'YYMMDD') AS t_date FROM some_date_table);
    

    如果没有,那么你必须使用 CASE 或 DECODE:

    SELECT dt_year||'.'||dt_month||'.'||dt_day AS date_ FROM
      (SELECT 
         CASE 
          WHEN SUBSTR(some_date,1,2) BETWEEN 0 AND 12 THEN 20||SUBSTR(some_date,1,2)
          WHEN SUBSTR(some_date,1,2) BETWEEN 13 AND 99 THEN 19||SUBSTR(some_date,1,2)
         END AS dt_year,
         CASE 
          WHEN SUBSTR(some_date,3,1) IN('1','2','3','4','5','6','7','8','9') THEN 0||SUBSTR(some_date,3,1)
          WHEN SUBSTR(some_date,3,1) = 'A' THEN '10'
          WHEN SUBSTR(some_date,3,1) = 'B' THEN '11' 
          WHEN SUBSTR(some_date,3,1) = 'C' THEN '12'
         END AS dt_month,
         SUBSTR(some_date,4,2) AS dt_day FROM some_date_table);
    

    【讨论】:

      【解决方案4】:

      col 是包含字符串的表 tb3 的列

      create table tb3(col varchar(max))
      insert into tb3 values('120617T')
      
      declare @tmp varchar(max) 
      select @tmp=case 
      when substring(col,3,1)='A' then replace(col,'A','10')
      when substring(col,3,1)='B' then replace(col,'B','11')
      when substring(col,3,1)='C' then replace(col,'C','12') 
      when substring(col,3,1)!='0' then replace(col,substring(col,3,1),'0'+substring(col,3,1))
      else col end 
      from tb3
      
      SELECT CONVERT(VARCHAR(10), convert(datetime,substring(@tmp,1,len(@tmp)-1),109), 104)
      

      输出

      17.06.2012

      【讨论】:

        猜你喜欢
        • 2012-08-07
        • 2020-01-09
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2021-12-14
        • 2018-07-13
        相关资源
        最近更新 更多