2017-12-22 22 views
1

以下に示すクエリは変換は、文字列から日付および/または時刻を変換する際に、文字列から日付/時刻を変換

変換が失敗したエラーの原因となっているときに障害が発生した

助けてください

SELECT 
    a.[Prod_id], a.[ctry_id], a.[ctry_cd], 
    left(a.[re_ver],8) + ' (Per ' + a.[re_ver] + ')' as [re_ver], 
    'YTD' as [per_type], 
    sum(b.[unt_cas_cy_bp]) [unt_cas_cy_bp], 
    sum(b.[unt_cas_cy_re]) [unt_cas_cy_re], 
    sum(b.[unt_cas_py_act]) [unt_cas_py_act], 
    sum(b.[unt_cas_2py_act]) [unt_cas_2py_act] 
FROM 
    a 
INNER JOIN 
    b ON a.Prod_id = b.Prod_id 
     AND a.ctry_id = b.ctry_id 
     AND a.ctry_cd = b.ctry_cd 
     AND b.per_type = 'Monthly' 
     AND YEAR(LEFT(b.re_ver, 8)) * 100 + MONTH(LEFT(b.re_ver, 8)) 
       BETWEEN YEAR(LEFT(a.re_ver, 8)) * 100 + 1 
        AND YEAR(LEFT(a.re_ver, 8)) * 100 + MONTH(LEFT(a.re_ver, 8)) 
WHERE 
    a.per_type = 'Yearly' 
GROUP BY 
    a.[Prod_id], a.[ctry_id], a.[ctry_cd], 
    a.[re_ver], a.[per_type] 
+0

この部分 'と年になるだろう(LEFT(b.re_ver、8))*年(LEFT(a.re_ver、8))* 100 + 1 AND YEAR(LEFT(a.re_ver、8))* 100 + MONTH(LEFT(a .re_ver、8)私はいくつかのサンプルデータを提供します – scsimon

+0

データは2017年2月、Q4 2017のようなもので、varcharデータ型として宣言されました – user7449410

+0

何ですか? * 100? – scsimon

答えて

0

あなたの略語は、3文字または4文字の長さです。すなわち9月9月と略記されます。このvarcharフィールドからdate列を奇妙な方法で作成しようとしていますが、それは不可能です。代わりに、CTEでコンバージョンを行い、where句に使用します。

declare @badData table (re_ver varchar(64)) 
insert into @badData 
values 
('Feb 2017,Q4 2017'), 
('Sept 2017,Q3 2016') 

;with cte as(
select 
    re_ver 
    ,re_ver_date = cast(
         cast(case 
          when left(re_ver,4) = 'Jan' then 1 
          when left(re_ver,4) = 'Feb' then 2 
          when left(re_ver,4) = 'Mar' then 3 
          when left(re_ver,4) = 'Apr' then 4 
          when left(re_ver,4) = 'May' then 5 
          when left(re_ver,4) = 'Jun' then 6 
          when left(re_ver,4) = 'Jul' then 7 
          when left(re_ver,4) = 'Aug' then 8 
          when left(re_ver,4) = 'Sept' then 9 
          when left(re_ver,4) = 'Oct' then 10 
          when left(re_ver,4) = 'Nov' then 11 
          when left(re_ver,4) = 'Dec' then 12 
         end as varchar(2)) 
         + '/' 
         + '01' 
         + '/' 
         + cast(right(substring(re_ver,1,charindex(',',re_ver) - 1),4) as char(4)) 
        as date) 
from 
    @badData) 

select * 
from cte 
--where <your condition> 

は、私は、クエリではないQ# YYYY一部、「月YYYY」の部分から年に取得しています。あなたは四半期部から一年にしたい場合は、ちょうど最後の行を次のように変更します

cast(right(re_ver,4) as char(4))

関連する問題