MaxCompute'te iki tarih veya zaman damgası değerini çıkardığınızda sonuç bir INTERVAL olur; bu, aralarındaki zaman farkını temsil eden türü belirtilmiş bir gösterimdir. MaxCompute iki INTERVAL alt türü sunar: Yıl ve ay cinsinden takvim tabanlı aralıklar için INTERVAL_YEAR_MONTH ile gün, saat, dakika ve saniye cinsinden sabit uzunluklu aralıklar için INTERVAL_DAY_TIME. Bu iki alt tür farklı zaman ölçeklerine dayandığından aritmetik işlemlerde birlikte kullanılamaz.
Ön koşullar
Başlamadan önce aşağıdaki adımları tamamladığınızdan emin olun:
-
Oturumunuzda aşağıdaki deyimi çalıştırarak MaxCompute 2.0 tür sistemini etkinleştirin:
SET odps.sql.type.system.odps2=true;
INTERVAL_YEAR_MONTH
INTERVAL_YEAR_MONTH, yıl ve ay cinsinden bir aralığı saklar.
Söz dizimi
String pattern sütununda gösterilen dize kalıbını kullanın. Negatif bir aralık ifade etmek için kalıp değerinin önüne - ekleyin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Geçerli aralıklar ve taşma davranışı
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Yalnızca ay içeren taşma örneği
Yalnızca MONTH aralığını belirttiğinizde değer 11'i aşabilir. MaxCompute fazla ayları otomatik olarak yıla dönüştürür:
SELECT INTERVAL '200' MONTH;
Sonuç:
+------+
| _c0 |
+------+
| 16-8 |
+------+
200 ay = 16 yıl 8 ay.
YEAR TO MONTH — ay aralık dışı (hata)
YEAR TO MONTH kullanırken ay değeri 0 ile 11 arasında olmalıdır:
SELECT INTERVAL '-2021-12' YEAR TO MONTH;
Sonuç:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse -2021-12 as a valid INTERVAL_DAY_TIME
INTERVAL_DAY_TIME
INTERVAL_DAY_TIME; gün, saat, dakika, saniye ve kesirli saniye cinsinden bir aralığı saklar.
Söz dizimi
String pattern sütununda gösterilen dize kalıbını kullanın. Negatif bir aralık ifade etmek için kalıp değerinin önüne - ekleyin.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Geçerli aralıklar ve taşma davranışı
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tek birimlik taşma örneği
Yalnızca tek bir zaman birimi belirttiğinizde değer üst sınırını aşabilir. MaxCompute fazlalığı otomatik olarak bir üst birime dönüştürür:
SELECT INTERVAL '24' HOUR; -- Equivalent to INTERVAL '1' DAY
SELECT INTERVAL '60' MINUTE; -- Equivalent to INTERVAL '1' HOUR
SELECT INTERVAL '6000' SECOND; -- Equivalent to INTERVAL '1:40' HOUR TO MINUTE
Çok birimli değer aralık dışı (hata)
Çok birimli biçim kullanırken her alan geçerli aralık içinde kalmalıdır:
SELECT INTERVAL '23:60' HOUR TO MINUTE;
Sonuç:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse 23:60 as a valid INTERVAL_DAY_TIME
Desteklenen işlemler
Aynı türdeki INTERVAL değerlerini toplama veya çıkarma
Toplama ve çıkarma işlemleri aynı türdeki INTERVAL değerleri arasında çalışır. INTERVAL_YEAR_MONTH ile INTERVAL_DAY_TIME arasındaki işlemler desteklenmez; çünkü bu iki tür farklı zaman ölçeklerini (takvim ayları ile sabit uzunluklu saniyeler) kullanır.
İki INTERVAL_DAY_TIME değerini toplama:
SELECT INTERVAL '24' HOUR + INTERVAL '23' HOUR;
Sonuç:
+----------------------+
| _c0 |
+----------------------+
| 1 23:00:00.000000000 |
+----------------------+
İki INTERVAL_DAY_TIME değerini çıkarma:
SELECT INTERVAL '24' HOUR + INTERVAL '-23' HOUR;
Sonuç:
+----------------------+
| _c0 |
+----------------------+
| 0 01:00:00.000000000 |
+----------------------+
İki INTERVAL_YEAR_MONTH değerini çıkarma:
SELECT INTERVAL '5-1' YEAR TO MONTH - INTERVAL '9-2' YEAR TO MONTH;
Sonuç:
+------+
| _c0 |
+------+
| -4-1 |
+------+
Türler arası aritmetik (hata):
SELECT INTERVAL '2000-1' YEAR TO MONTH + INTERVAL '1 23:59:59.999' DAY TO SECOND;
Sonuç:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) INTERVAL_YEAR_MONTH,INTERVAL_DAY_TIME for operator '+'
INTERVAL_DAY_TIME elde etmek için DATE, TIMESTAMP veya TIMESTAMP_NTZ değerlerini çıkarma
İki DATE, TIMESTAMP veya TIMESTAMP_NTZ değerini çıkarmak INTERVAL_DAY_TIME sonucu döndürür. İki DATETIME değerini çıkarma işlemi desteklenmez.
İki DATE değerini çıkarma:
SELECT DATE '2021-10-29' - DATE '2024-11-29';
Sonuç:
+--------------------------+
| _c0 |
+--------------------------+
| -1127 00:00:00.000000000 |
+--------------------------+
İki TIMESTAMP değerini çıkarma:
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';
Sonuç:
+-------------------------+
| _c0 |
+-------------------------+
| 1127 00:00:10.000000000 |
+-------------------------+
DATETIME çıkarma (hata):
SELECT DATETIME '2024-11-11 00:00:00' - DATETIME'2021-11-11 00:00:00';
Sonuç:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,DATETIME for operator '-'
DATE, TIMESTAMP veya TIMESTAMP_NTZ değerine INTERVAL ekleme veya çıkarma
Bir DATE, TIMESTAMP veya TIMESTAMP_NTZ değerine INTERVAL eklemek veya çıkarmak aynı türde bir değer döndürür. Bu işlem DATETIME değerleri için desteklenmez.
DATE değerinden INTERVAL_YEAR_MONTH çıkarma:
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;
Sonuç:
+------------+
| _c0 |
+------------+
| 2021-12-11 |
+------------+
TIMESTAMP_NTZ değerinden INTERVAL_DAY_TIME çıkarma:
SELECT TIMESTAMP_NTZ'2024-11-29 00:01:10' - INTERVAL '1 23' DAY TO HOUR;
Sonuç:
+---------------------+
| _c0 |
+---------------------+
| 2024-11-27 01:01:10 |
+---------------------+
DATETIME ile INTERVAL (hata):
SELECT DATETIME '2024-11-11 00:00:00' - INTERVAL '1 23' DAY TO HOUR;
Sonuç:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,INTERVAL_DAY_TIME for operator '-'