السرعة
Date أسرع من DateTime في معظم الحالات.
يتطلب النوع Date مساحة تخزين قدرها 2 بايت، بينما يتطلب DateTime 4 بايتات. ومع ذلك، أثناء الضغط، يصبح الفرق في الحجم بين Date وDateTime أكثر وضوحًا. ويرجع هذا التضخيم إلى أن الدقائق والثواني في DateTime أقل قابليةً للضغط. كما أن تصفية Date وتجميعه بدلًا من DateTime أسرع أيضًا.
ملاحظات الاستخدام
DateTime بتنسيق نصي، وفي كيفية تحليل القيم المحددة كسلاسل نصية (‘2020-01-01 05:00:01’).
يُخزَّن Unix timestamp غير المرتبط بمنطقة زمنية في الجداول، وتُستخدم المنطقة الزمنية لتحويله إلى تنسيق نصي أو العكس أثناء استيراد البيانات أو تصديرها، أو لإجراء حسابات تقويمية على القيم (على سبيل المثال: الدالتان toDate وtoHour، إلخ). ولا تُخزَّن المنطقة الزمنية في صفوف الجدول (أو في resultset)، بل تُخزَّن في البيانات الوصفية للعمود.
يمكن العثور على قائمة بالمناطق الزمنية المدعومة في IANA Time Zone Database، كما يمكن الاستعلام عنها باستخدام SELECT * FROM system.time_zones. وهذه القائمة متاحة أيضًا على Wikipedia.
يمكنك تعيين منطقة زمنية صراحةً للأعمدة من النوع DateTime عند إنشاء جدول. Example: DateTime('UTC'). وإذا لم تُعيَّن منطقة زمنية، يستخدم ClickHouse قيمة المعلمة timezone في إعدادات الخادم أو في إعدادات نظام التشغيل وقت بدء تشغيل ClickHouse server.
يستخدم clickhouse-client المنطقة الزمنية الخاصة بالخادم افتراضيًا إذا لم تُعيَّن منطقة زمنية صراحةً عند تهيئة نوع البيانات. ولاستخدام المنطقة الزمنية الخاصة بالعميل، شغّل clickhouse-client باستخدام المعلمة --use_client_time_zone.
يعرض ClickHouse القيم وفقًا لقيمة الإعداد date_time_output_format. ويكون التنسيق النصي الافتراضي هو YYYY-MM-DD hh:mm:ss. بالإضافة إلى ذلك، يمكنك تغيير تنسيق الإخراج باستخدام الدالة formatDateTime.
عند insert البيانات إلى ClickHouse، يمكنك استخدام تنسيقات مختلفة لسلاسل التاريخ والوقت، وذلك بحسب قيمة الإعداد date_time_input_format.
أمثلة
DateTime وإدخال بيانات إليه:
- عند إدراج قيمة datetime كعدد، تُعامَل على أنها Unix Timestamp (UTC) بالثواني. تمثّل
1546300800القيمة'2019-01-01 00:00:00'بتوقيت UTC. ولكن بما أن العمودtimestampمحدَّد له المنطقة الزمنيةAsia/Istanbul(UTC+3)، فعند إخراجها كسلسلة نصية ستظهر القيمة على شكل'2019-01-01 03:00:00'. يُقبل أيضًا عدد ذو جزء كسري أو جزء أسي ويُقتطع إلى ثوانٍ كاملة، بما يتوافق معCASTوtoDateTimeوتنسيقValues. (قبل الإصدار 26.8، لم يكن المحلل المتدفق يقبل مثل هذا العدد الكسري أو الأسي في مسارات الإدخالJSONوValues/Quoted— إذ يغطي الأخير كل تنسيق يحلل الحقول باستخدام قاعدة الإفلاتQuoted: وهيValues، وMySQLDump، وTemplate/CustomSeparated/Regexpالمُعدّة بإفلات الحقولQuoted—؛ عيّنinput_format_read_datetime_number_as_raw_value = 1لاستعادة هذا السلوك. في تنسيقValuesنفسه، كانت هذه القيمة الحرفية تعمل — وما زالت تعمل في وضع التوافق — من خلال المسار الاحتياطي لتعبير SQL، الذي يقرأها كعدد من الثواني. فيJSONExtractونوع البياناتJSON، تُحلَّل القيمة الكسرية عبرFloat64، لذا قد تُقرَّب قيمة قريبة من حدّ ثانية كاملة إلى الثانية المجاورة، بخلاف تنسيقات إدخال الصفوف التي تقتطع النص الأصلي بدقة. لا تخضع تنسيقات النص المفصول بعلامات الجدولة وCSV وتنسيقات النص الأخرى ذات الإفلات لهذا الإعداد.) - عند إدراج قيمة نصية كـ datetime، تُعامَل على أنها ضمن المنطقة الزمنية للعمود. ستُعامَل
'2019-01-01 00:00:00'على أنها ضمن المنطقة الزمنيةAsia/Istanbulوتُحفَظ على أنها1546290000.
DateTime
DateTime باستخدام قيمة نصية في شرط WHERE. وسيُحوَّل هذا تلقائيًا إلى DateTime:
DateTime:
القيود على دعم المناطق الزمنية
التعامل مع التوقيت الصيفي (DST)
DateTime في ClickHouse مع المناطق الزمنية سلوكًا غير متوقع أثناء الانتقال بين التوقيت الصيفي (DST) والتوقيت القياسي، وخصوصًا عندما:
- يكون
date_time_output_formatمضبوطًا علىsimple. - تُعاد الساعات إلى الخلف (“Fall Back”)، مما يؤدي إلى تداخل لمدة ساعة واحدة.
- تُقدَّم الساعات إلى الأمام (“Spring Forward”)، مما يؤدي إلى فجوة لمدة ساعة واحدة.
- في 29 أكتوبر 2023، عند 02:00:00، تُعاد الساعات إلى الخلف إلى 01:00:00 (BST → GMT).
- تظهر الساعة 01:00:00 – 01:59:59 مرتين (مرة بتوقيت BST ومرة بتوقيت GMT)
- يختار ClickHouse دائمًا الظهور الأول (BST)، مما يؤدي إلى نتائج غير متوقعة عند إضافة فواصل زمنية.
- في 26 مارس 2023، عند
00:59:59، تُقدَّم الساعة مباشرةً إلى 02:00:00 (GMT → BST). - الساعة
01:00:00–01:59:59غير موجودة.
2023-03-26 01:30:00 إلى 2023-03-26 00:30:00.