سلام به همه شمایی که این مقاله رو میخونین !
همونطور که میدونین یکی از تفاوت های postgresql و sql server نحوه ذخیره سازی time هست . توی این مقاله میخوایم ببینیم که تایپ های زمانی postgresql چیا هستن و چه تفاوتی با sql server دارن.
هر نوع دیتایی از زمان (مثلا time یا datetime) بدون منطقه زمانی (time zone) و به همان صورتی که insert شده باشد ذخیره می شود و هر وقت که بخواهیم دیتا را بخوانیم باید تشخیص دهیم که آن دیتا با چه time zone ای ذخیره شده است که دردسر های خاص خودش را دارد و باید همیشه مراقب یکپارچه بودن دیتا در write و read باشیم (مثلا آن را همیشه UTC در نظر بگیریم).
در postgresql هر تایپی که time در خودش داشته باشد به دو صورت ذخیره می شود
1. time(stamp) without time zone
2. time(stamp) with time zone
در ادامه اونا رو توضیح میدم :
در واقع این مورد مثل sql server رفتار می کند و شما می توانید بدون مشخص کردن موقعیت زمانی دیتا را ذخیره کنید.
اینجاست که به تفاوت بین sql server و postgresql می رسیم. در این مورد دیتابیس رفتار ویژه ای رو خواهد داشت.
در insert کردن دیتا ، درصورتی که دیتا بدون مشخص کردن موقعیت زمانی وارد شده باشد دیتابیس آن را با موقعیت زمانی local سیستم در نظر میگیرد اما درصورتی که به صورت مخصوص موقعیت زمانی را مشخص کنیم دیتابیس دیتای وارد شده رو با همان موقعیت زمانی ذکر شده در نظر میگیرد.
لازم به ذکره که postgres در هر حال دیتای زمانی رو در هسته دیتابیس به صورت UTC ذخیره میکنه.
در خواندن دیتا، دیتابیس در هر صورت دیتا را به timezone سیستم تغییر میدهد و زمان با موقعیت زمانی local را دریافت خواهید کرد.
دیدیم که تفاوت های postgresql و sql server در داشتن موقعیت زمانی (time zone) هستش و اینکه در postgres برای ذخیره دیتای (timestamp with time zone) میتونید هم با ذکر موقعیت زمانی مد نظر خود و هم بدون ذکر موقعیت زمانی دیتا رو ذخیره کنید که در این صورت موقعیت زمانی local سیستم در نظر گرفته خواهد شد و در هر حال postgres در هسته خودش زمان ها رو به صورت پیشفرض UTC ذخیره میکنه ، در read دیتای زمانی دیدیم که postgres در هر حال دیتا رو به موقعیت زمانی محلی تبدیل میکنه و البته موقعیت زمانی رو هم براتون ذکر میکنه.
امیدوارم این مقاله براتون مفید بوده باشه .