2016-04-04 17 views
0

Aşağıdaki sorguyu çalıştırmaya çalışıyorum. Ben sorguda parametreoracle geçersiz biçim modeli, tarihlerin karşılaştı? Ile

SELECT to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP 
    ,sum(TwoG) TwoG 
    ,sum(ThreeG) ThreeG 
    ,sum(FourG) FourG 
FROM (
    SELECT * 
    FROM T_CA_Cellsdown 

    UNION ALL 

    SELECT * 
    FROM T_CA_Cellsdown_TFVF 
    ) 
WHERE trunc(TIMESTAMP) = trunc(to_date('03-Apr-16', 'dd-Mon-yy')) 
    AND Type = 'Network' 
GROUP BY to_char(TIMESTAMP, 'HH24') * 1 
ORDER BY to_char(TIMESTAMP, 'HH24') * 1 

Hata dan tarihini geçirerek: ORA-01481: geçersiz sayı biçimi modeli aşağıdaki sorgu çalışır

. Ben sadece sysdate değiştirmeye çalıştığım bir tarih dizgesine php olarak kullanıcı girişi üzerinden geçiyorum. Neden 1 ile çarpıldığını bilmiyorum, bu, çalışarak istenen sonucu veren bir sorgudur.

SELECT to_char(TIMESTAMP, 'HH24') * 1 
    ,sum(TwoG) TwoG 
    ,sum(ThreeG) ThreeG 
    ,sum(FourG) FourG 
FROM (
    SELECT * 
    FROM T_CA_Cellsdown 

    UNION ALL 

    SELECT * 
    FROM T_CA_Cellsdown_TFVF 
    ) 
WHERE trunc(TIMESTAMP) = trunc(sysdate-1) 
    AND Type = 'Network' 
GROUP BY to_char(TIMESTAMP, 'HH24') * 1 
ORDER BY to_char(TIMESTAMP, 'HH24') * 1 
+2

NLS_DATE_LANGUAGE'niz nedir ('nls_session_parameters konumundan parametre = 'NLS_DATE_LANGUAGE' 'şeklindedir)? "TIMESTAMP" sütununda hangi veri türü var? Bir tarih/zaman damgası olmadığını tahmin edeceğim mi? Son olarak, neden 1 ile çarpıyorsunuz (biraz garip bir şey etkilememelisiniz)? – Ben

+1

Eğer saatlerin sayısını istediğiniz gibi çıkarabiliyorsanız (saat damgasıyla saat) '. Kesin olarak dönüştürmek veya to_number kullanarak 1 ile çarpmaktan daha basittir. Zaman damgası sütununuz ne tür bir şeydir - belirgin sesler, ancak aslında bir zaman damgası, bir tarih veya bir dizedir? NLS ayarlarını 'NLS_SESSION_PARAMETERS' ile sorgulayarak kontrol edebilirsiniz. Oradayken NLS_DATE_FORMAT ve NLS_TIMESTAMP_FORMAT adresini kontrol edin. (Ve soruya bilgi ekleyin). –

+0

NLS_DATE_LANGUAGE ’ı nasıl bulabilirim?TIMESTAMP, DATE_TIME – shorif2000

cevap

2

sorun son çizgidir: select listeden kolon takma adı olarak fıkra sipariş tarafından o görüyor TIMESTAMP olarak

ORDER BY to_char(TIMESTAMP, 'HH24') * 1 

değil tablodan orijinal TIMESTAMP olarak; bu yüzden bir sayı, bir zaman damgası içermez. Eğer saat değeri 13 olan bir zaman damgası olsaydı

Yani, diyelim ki, sen

ORDER BY to_char(13, 'HH24') * 1` 

yapıyoruz ... ve ilk argüman olarak size TO_CHAR() sayısal sürümünü kullanıyorsanız bir sayıdır ve HH24 bunun için geçerli bir biçim modelidir. Hata mesajının söylediği şey budur.

Sen tıpkı yapabilirsiniz:

ORDER BY TIMESTAMP; 

ZAMAN nitelemek, sırayla-by o takma ad kullanmak o zaman satır içi görünümü için bir tablo diğer adı tedarik gerekiyordu orijinal desen kullanın ve için . Varsayılan olarak sütun takma adını kullanıyor. Son olarak,

+0

Bazı nedenlerden ötürü onu diğer gönderilerle karıştırdığımı biliyorum. Ama o aynı emirle başka bir sorguyu yayınladı. – sagi

+0

@sagi - OP'nin sorgularının her ikisi de ORA-01481 olsun, bu yüzden gerçekten çalıştıklarını sanmıyorum, ya da eşleşmeyen verileri yoktu (hatanın üzerinden geçemez) Bize söylemedikleri başka bir şey var * 8-) –

+0

@AlexPoole Sysdate -1 ile yapılan sorgu her zaman işe yaradı ve gelmeden çok önce oradaydı. Bu dinamik bir web uygulamasında bir tarih değeri geçirerek çalışarak, sysdate'den çıkarma işlemine kadar geçen gün sayısını hesaplamak sadece daha fazla kodlama çalışmasıdır. 'Oracle'da trunc' seçili günün gece yarısı anlamına gelir? – shorif2000

0

order by yürütülür. order by zamanında yürütüldüğünde, select deyiminde timestamp olarak yeni bir sütun türetiyorsunuz. bunun üstesinden gelmek için, sadece

SELECT to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP 
    ,sum(TwoG) TwoG 
    ,sum(ThreeG) ThreeG 
    ,sum(FourG) FourG 
FROM (
    SELECT * 
    FROM T_CA_Cellsdown 

    UNION ALL 

    SELECT * 
    FROM T_CA_Cellsdown_TFVF 
    ) 
WHERE trunc(TIMESTAMP) = trunc(to_date('03-APR-16', 'dd-Mon-yy')) 
    AND Type = 'Network' 
GROUP BY to_char(TIMESTAMP, 'HH24') * 1 
ORDER BY TIMESTAMP -- TIMESTAMP here refers to derived column at line 1 

tarafından sırayla timestamp kullanmak Yoksa burada sorunu çoğaltılmış bu

SELECT to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP1 -- Or use different alias 
    ,sum(TwoG) TwoG 
    ,sum(ThreeG) ThreeG 
    ,sum(FourG) FourG 
FROM (
    SELECT * 
    FROM T_CA_Cellsdown 

    UNION ALL 

    SELECT * 
    FROM T_CA_Cellsdown_TFVF 
    ) 
WHERE trunc(TIMESTAMP) = trunc(to_date('03-APR-16', 'dd-Mon-yy')) 
    AND Type = 'Network' 
GROUP BY to_char(TIMESTAMP, 'HH24') * 1 
ORDER BY to_char(TIMESTAMP, 'HH24') * 1 

kullanın. - Bu işe yaramayacak.

select to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP,sum(col1) from 
(
select sysdate-1 as TIMESTAMP,1 as col1 from dual 
union all 
select sysdate-1 as TIMESTAMP,2 as col1 from dual 
) 
where trunc(sysdate)=trunc(to_date('04-APR-16','Dd-Mon-YY')) 
group by to_char(TIMESTAMP, 'HH24') * 1 
order by to_char(TIMESTAMP, 'HH24') * 1 

Ancak bu ifade çalışacaktır.

select to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP1,sum(col1) from (
select sysdate-1 as TIMESTAMP,1 as col1 from dual 
union all 
select sysdate-1 as TIMESTAMP,2 as col1 from dual 
) 
where trunc(sysdate)=trunc(to_date('04-APR-16','Dd-Mon-YY')) 
group by to_char(TIMESTAMP, 'HH24') * 1 
order by to_char(TIMESTAMP, 'HH24') * 1 --As TIMESTAMP is now reflecting the column from inner table. 
+0

Lütfen cevabınızın neden cevabını sorduğunu açıklayabilir misiniz? Sorgunuz ile OP'ler arasındaki farkları görmek zordur ve OP'nin neden yanlış olduğunu belirtmediniz ... – Ben

+0

Cevabın üst kısmında değindim. 'siparişi en sonunda yürütülür. Zaman emri ile, zaman damgası ' – Utsav

+0

adlı select deyiminde yeni bir sütun türetiyorsunuz, ben de sorunu çoğaltmak ve takma ad olarak farklı bir sütun adı kullanarak çözüldü. – Utsav