காலப்போக்கில் தற்போதைய நிலை

ஜேடிபிசி கண்டுபிடிக்கப்பட்டு அதன் இடைமுகங்கள் தரப்படுத்தப்பட்ட காலத்திலிருந்து, 20 ஆண்டுகள் கடந்துவிட்டன, இந்த நேரத்தில் நிறைய விஷயங்கள் மாறிவிட்டன.

முதலாவதாக, உலகம் உலகளாவியதாகிவிட்டது, இப்போது ஒரு சேவையகம் உலகம் முழுவதும் உள்ள பயனர்களுக்கு சேவை செய்ய முடியும். இணைய வேகம் கூடியுள்ளது. எனவே, நேரத்துடன் வேலை செய்ய மற்றொரு தரவு வகை SQL இல் சேர்க்கப்பட்டது . இப்போது வகைகள் இப்படி இருக்கும்:

  • DATE - தேதியை சேமிக்கிறது: ஆண்டு, மாதம், நாள்.
  • TIME - நேரம் சேமிக்கிறது: மணிநேரம், நிமிடங்கள், வினாடிகள்.
  • TIMESTAMP - குறிப்பிட்ட நேரத்தில் ஒரு புள்ளியை சேமிக்கிறது: தேதி, நேரம் மற்றும் மில்லி விநாடிகள்.
  • நேர மண்டலத்துடன் கூடிய டைம்ஸ்டாம்ப் - டைம்ஸ்டாம்ப் மற்றும் நேர மண்டலம் (மண்டலத்தின் பெயர் அல்லது ஆஃப்செட்).

இரண்டாவதாக, ஜாவா உலகளாவிய நேர நிர்வாகத்திற்காக DateTime API ஐ அறிமுகப்படுத்தியது. இது பின்வரும் வகுப்புகளைக் கொண்டுள்ளது:

  • தேதி மற்றும் நேரம் :
    • உள்ளூர் தேதி
    • உள்ளூர் நேரம்
  • சரியான தருணம் :
    • java.time.Instant
    • java.time.LocalDateTime
    • java.time.OffsetDateTime
    • java.time.ZonedDateTime
  • நேர மண்டலத்துடன் நேரம் :
    • java.time.OffsetDateTime
    • java.time.ZonedDateTime

மூன்றாவது சுவாரஸ்யமான விஷயம் என்னவென்றால், பல SQL கிளையண்டுகள் ஏற்கனவே தங்கள் உள்ளூர் மண்டலத்தில் உள்ள சேவையகத்திலிருந்து நேரத்தைப் பெற விரும்புகிறார்கள் . நிச்சயமாக, நீங்கள் பறக்க நேரத்தை மாற்ற முடியும், ஆனால் அது வசதியாக இல்லை, மற்றும் தவறுகள் உள்ளன.

எடுத்துக்காட்டாக, டேட்டாபேஸில் இருந்து இன்றைய அனைத்து பணிகளையும் பெற விரும்புகிறேன். SQL சேவையகம் இதற்கு CURDATE() செயல்பாட்டைக் கொண்டுள்ளது. இங்கு மட்டும் சர்வர் அமெரிக்காவில் உள்ளது, நான் ஜப்பானில் இருக்கிறேன். மேலும் "அவருடைய இன்றைய" பதிவுகளை அல்ல, "எனது இன்று" என்பதற்கான அனைத்து பதிவுகளையும் அவர் திருப்பி அனுப்ப வேண்டும் என்று நான் விரும்புகிறேன்.

பொதுவாக, SQL சேவையகம் வெவ்வேறு நேர மண்டலங்களில் உள்ள வாடிக்கையாளர்களுடன் நன்றாக வேலை செய்ய முடியும்.

நவீன பிரச்சனைகளுக்கு நவீன தீர்வுகள் தேவை

கொள்கையளவில், Java DateTime API இலிருந்து புதிய வகைகள் மற்றும் SQL இலிருந்து வகைகளை வசதியாக வரைபடமாக்க முடியும். ஜாவாவில் DATE வகையைப் பிரதிநிதித்துவப்படுத்த , JDK 8 DateTime API இலிருந்து java.time.LocalDate வகுப்பைப் பயன்படுத்த வேண்டும் .

தரவுத்தளத்திலிருந்து TIME வகையை ஜாவாவிலிருந்து இரண்டு வகைகளால் குறிப்பிடலாம்: java.time.LocalTime மற்றும் java.time.OffsetTime . சிக்கலான எதுவும் இல்லை.

தரவுத்தளத்தில் TIMESTAMP வகையால் குறிப்பிடப்படும் ஒரு குறிப்பிட்ட நேரப் புள்ளியை ஜாவாவில் 4 வகைகளால் குறிப்பிடலாம்:

  • java.time.Instant
  • java.time.LocalDateTime
  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

இறுதியாக, TIMESTAMP உடன் TIME ZONE இரண்டு வகைகளால் குறிப்பிடப்படலாம்:

  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

DateTime API உங்களுக்கு ஏற்கனவே தெரிந்திருப்பதால், இந்த விஷயத்தை நினைவில் கொள்வது உங்களுக்கு கடினமாக இருக்காது :)

நான் அதை ஒரு அட்டவணை வடிவத்தில் எழுதுவேன், அது எளிதாக இருக்கும்:

SQL வகை ஜாவா வகை
DATE java.time.LocalDate
நேரம் java.time.LocalTime
java.time.OffsetTime
நேர முத்திரை java.time.Instant
java.time.LocalDateTime
java.time.OffsetDateTime
java.time.ZonedDateTime
நேர மண்டலத்துடன் கூடிய நேர முத்திரை java.time.OffsetDateTime
_

தேதியைப் பெறுகிறது

உங்களுக்கு ஒரு நல்ல செய்தி உள்ளது. நீண்ட காலத்திற்குப் பிறகு முதல். java.sql தேதி வகையை வழங்கும் getDate() முறையின் வரம்பைச் சுற்றி வரலாம் .

பொருள் என்பது பொருள்முடிவு தொகுப்புமற்றொரு சுவாரஸ்யமான முறை உள்ளது - getObject() . இந்த முறை இரண்டு அளவுருக்களை எடுக்கும்: ஒரு நெடுவரிசை மற்றும் ஒரு வகை, மேலும் கொடுக்கப்பட்ட வகைக்கு மாற்றப்பட்ட நெடுவரிசையின் மதிப்பை வழங்குகிறது. முறையின் பொதுவான வடிவம் பின்வருமாறு:

ClassName Name = getObject(column, ClassName);

நீங்கள் DATE வகையை java.time.LocalDate வகைக்கு மாற்ற விரும்பினால் , நீங்கள் இதைப் போன்ற ஒன்றை எழுத வேண்டும்:

LocalDate localDate = results.getObject(4, LocalDate.class);

பொதுவாக எந்த TIMESTAMPஐயும் பல வகைகளாக மாற்றலாம்:

java.time.Instant instant = results.getObject(9, java.time.Instant.class);
java.time.LocalDateTime local = results.getObject(9, java.time. LocalDateTime.class);
java.time.OffsetDateTime offset = results.getObject(9, java.time. OffsetDateTime.class);
java.time.ZonedDateTime zoned = results.getObject(9, java.time. ZonedDateTime.class);

முக்கியமான! உங்களிடம் காலாவதியான MySQL JDBC டிரைவர் இருந்தால் இந்த குறியீடு வேலை செய்யாது . உங்கள் pom.xml இல் எழுதப்பட்ட "mysql-connector-java" பதிப்பில் கவனம் செலுத்துங்கள் அல்லது திட்ட அமைப்புகளில் நூலகங்களில் சேர்க்கப்பட்டது.

மூலம், அதே வழியில், பழமையான வகைகளுக்கு பூஜ்யத்தை சேமிக்க இயலாமையை நீங்கள் சுற்றி வரலாம். அட்டவணை நெடுவரிசை INT வகையாக இருந்தால், அதிலிருந்து பூஜ்யத்தைப் பெற இரண்டு வழிகள் உள்ளன. கீழே உள்ள உதாரணத்தைப் பார்க்கவும்:

Integer id1 = results.getObject(8, Integer.class);    	 // this will work
Integer id2 = results.getObject(8, int.class);                 //this will also work
int id3 = results.getObject(8,  Integer.class);            	//method will return null, JVM will throw NPE
int id4 = results.getObject(8,  int.class);                    	//method will return null, JVM will throw NPE

MySQL இல் நேர மண்டல அமைப்பு

MySQL இல் கூட நிறைய சுவாரஸ்யமான விஷயங்கள் நடந்தன. உங்களுக்கு தெரியும், MySQL இணைப்பை உருவாக்கும் போது, ​​நீங்கள் அதில் பல்வேறு அளவுருக்களை சேர்க்கலாம் :
mysql://localhost:3306/db_scheme?Name=meaning&Name=meaning

எனவே, MySQL இல் நேர மண்டலங்களுடன் பணிபுரிய மூன்று அளவுருக்கள் சேர்க்கப்பட்டுள்ளன. சேவையகத்துடன் இணைப்பை நிறுவும்போது இந்த அளவுருக்களை நீங்கள் அனுப்பலாம்.

கீழே நான் அவர்களுடன் ஒரு அட்டவணை தருகிறேன்:

அளவுரு மதிப்புகள் இயல்புநிலை மதிப்பு
இணைப்பு நேர மண்டலம் உள்ளூர் | சர்வர் | பயனர் மண்டலம் சர்வர்
forceConnectionTimeZoneToSession உண்மை | பொய் உண்மை
உடனடிப் பாதுகாப்பு உண்மை | பொய் பொய்

connectionTimeZone அளவுருவைப் பயன்படுத்தி , எல்லா கோரிக்கைகளும் செயல்படுத்தப்படும் நேர மண்டலத்தை (நேர மண்டலம்) தேர்ந்தெடுக்கிறோம். கிளையண்டின் பார்வையில், சர்வர் குறிப்பிட்ட நேர மண்டலத்தில் இயங்குகிறது.

ForceConnectionTimeZoneToSession அளவுரு அமர்வு நேர_மண்டல மாறியை புறக்கணித்து, connectionTimeZone மூலம் மாற்றுகிறது.

இறுதியாக, preservInstants அளவுரு JVM இன் நேர மண்டலம் மற்றும் இணைப்பு நேர மண்டலத்திற்கு இடையேயான சரியான நேர-மாற்றத்தைக் கட்டுப்படுத்துகிறது.

மிகவும் பொதுவான கட்டமைப்புகள்:

  • connectionTimeZone=LOCAL & forceConnectionTimeZoneToSession=false - useLegacyDatetimeCode=true உடன் பழைய MySQL JDBC இயக்கி பதிப்பு 5.1 உடன் ஒத்துள்ளது.

  • connectionTimeZone=LOCAL & forceConnectionTimeZoneToSession=true என்பது தேதி மற்றும் நேர மதிப்புகளைக் கையாள மிகவும் இயற்கையான வழியை வழங்கும் புதிய பயன்முறையாகும்.

  • connectionTimeZone=SERVER & preservInstants=true - useLegacyDatetimeCode=false உடன் பழைய MySQL JDBC இயக்கி பதிப்பு 5.1 உடன் தொடர்புடையது.

  • connectionTimeZone=user_defined & preserveInstants=true - CET/CEST போன்ற பொதுவான சுருக்கமாக அமைக்கப்பட்டதால், சர்வரின் நேர மண்டலத்தை இணைப்பாளரால் அடையாளம் காண முடியாத சூழ்நிலையை சமாளிக்க உதவுகிறது.

ஆம், தேதிகள் ஒரு சுவாரஸ்யமான தலைப்பு மற்றும் அவற்றில் பல சிக்கல்கள் உள்ளன. பழமொழி சொல்வது போல்: இது பயமாக இருக்கிறது, நிச்சயமாக, ஆனால் நான் கோபப்படவில்லை! :)