ഡേറ്റ്‌ടൈം ഡാറ്റ തരങ്ങളെക്കുറിച്ചുള്ള കൃത്യമായ റഫറൻസ്. MySQL റഫറൻസ് ഗൈഡ്

തീയതിയും സമയവും ഡാറ്റ തരങ്ങൾ: തീയതിസമയം, തീയതി, ടൈംസ്റ്റാമ്പ്, സമയം, വർഷം. അവയിൽ ഓരോന്നിനും ഒരു ഇടവേളയുണ്ട് സ്വീകാര്യമായ മൂല്യങ്ങൾ, അതുപോലെ "null" എന്ന മൂല്യം, ഉപയോക്താവ് യഥാർത്ഥത്തിൽ അസാധുവായ മൂല്യം നൽകുമ്പോൾ ഉപയോഗിക്കുന്നു. പൂർണ്ണമായും വിശ്വസനീയമല്ലാത്ത ചില തീയതി മൂല്യങ്ങൾ സംഭരിക്കാൻ MySQL നിങ്ങളെ അനുവദിക്കുന്നു, ഉദാഹരണത്തിന് 1999-11-31. കാരണം, തീയതി മൂല്യനിർണ്ണയം കൈകാര്യം ചെയ്യുന്നത് അതിൻ്റെ ഉത്തരവാദിത്തമാണ് നിർദ്ദിഷ്ട ആപ്ലിക്കേഷൻ, SQL സെർവറുകൾ അല്ല. തീയതി മൂല്യനിർണ്ണയം വേഗത്തിലാക്കാൻ, മാസം 0-12 പരിധിയിലും ദിവസം 0-31 പരിധിയിലുമാണെങ്കിൽ മാത്രം MySQL പരിശോധിക്കുന്നു. ഈ ഇടവേളകൾ 0-ൽ ആരംഭിക്കുന്നു, DATE അല്ലെങ്കിൽ DATETIME കോളങ്ങളിൽ ദിവസമോ മാസമോ ഉള്ള തീയതികൾ സംഭരിക്കുന്നതിനുള്ള കഴിവ് MySQL-ന് നൽകാനാണ് ഇത് ചെയ്യുന്നത്. പൂജ്യത്തിന് തുല്യം. ജനനത്തീയതി സംഭരിക്കേണ്ട ആപ്ലിക്കേഷനുകൾക്ക് ഈ സവിശേഷത പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാണ് - ഇവിടെ ജനനദിവസമോ മാസമോ എല്ലായ്പ്പോഴും അറിയില്ല. അത്തരം സന്ദർഭങ്ങളിൽ, തീയതി 1999-00-00 അല്ലെങ്കിൽ 1999-01-00 ആയി സംഭരിച്ചിരിക്കുന്നു (എന്നാൽ DATE_SUB() അല്ലെങ്കിൽ DATE_ADD ഫംഗ്‌ഷനുകൾ അത്തരം തീയതികൾക്ക് ശരിയായ മൂല്യങ്ങൾ നൽകുമെന്ന് നിങ്ങൾ പ്രതീക്ഷിക്കേണ്ടതില്ല).

MySQL മൂല്യങ്ങൾ വീണ്ടെടുക്കുന്നു ഈ തരത്തിലുള്ളതീയതികൾ അല്ലെങ്കിൽ സമയം മാത്രം സ്റ്റാൻഡേർഡ് ഫോർമാറ്റ്, എന്നാൽ അതേ സമയം ഉപയോക്താക്കളിൽ നിന്ന് വന്നേക്കാവുന്ന വൈവിധ്യമാർന്ന ഫോർമാറ്റുകൾ വ്യാഖ്യാനിക്കാൻ ശ്രമിക്കുന്നു (ഉദാഹരണത്തിന്, ഒരു മൂല്യം വ്യക്തമാക്കുമ്പോൾ, ഒരു തീയതി അല്ലെങ്കിൽ സമയ തരം നൽകണം അല്ലെങ്കിൽ ഈ തരങ്ങളിൽ ഒന്നുള്ള മൂല്യവുമായി താരതമ്യം ചെയ്യണം). എന്നിരുന്നാലും, ഇനിപ്പറയുന്ന വിഭാഗങ്ങളിൽ വിവരിച്ചിരിക്കുന്ന ഫോർമാറ്റുകൾ മാത്രമേ പിന്തുണയ്ക്കൂ. മറ്റ് ഫോർമാറ്റുകളിൽ അളവ് ഉപയോഗിക്കുന്നത് പ്രവചനാതീതമായ ഫലങ്ങൾ ഉണ്ടാക്കിയേക്കാമെന്നതിനാൽ, അളവുകൾക്കായി ഉപയോക്താവ് സാധുവായ മൂല്യങ്ങൾ നൽകുമെന്ന് പ്രതീക്ഷിക്കുന്നു.

  • MySQL ഒന്നിലധികം ഫോർമാറ്റുകളിൽ മൂല്യങ്ങളെ വ്യാഖ്യാനിക്കാൻ ശ്രമിക്കുന്നുണ്ടെങ്കിലും, എല്ലാ സാഹചര്യങ്ങളിലും വർഷം അടങ്ങിയിരിക്കുന്ന തീയതി മൂല്യ വിഭാഗം ഇടതുവശത്തായിരിക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു. തീയതികൾ ഓർഡർ വർഷം-മാസം-ദിവസത്തിൽ (ഉദാഹരണത്തിന്, "98-09-04") വ്യക്തമാക്കണം, അല്ലാതെ മാസം-ദിവസം-വർഷം അല്ലെങ്കിൽ ദിവസം-മാസം-വർഷം എന്ന ക്രമത്തിലല്ല, അതായത്. നമ്മൾ സാധാരണയായി എഴുതുന്ന രീതിയല്ല (ഉദാഹരണത്തിന്, "09-04-98", "04-09-98").
  • MySQL ഒരു തീയതി അല്ലെങ്കിൽ സമയ തരം മൂല്യം യാന്ത്രികമായി ഒരു നമ്പറിലേക്ക് മാറ്റും നൽകിയ മൂല്യംഒരു സംഖ്യാ സന്ദർഭത്തിൽ ഉപയോഗിക്കുന്നു, തിരിച്ചും.
  • പരിധിക്ക് പുറത്തുള്ള തീയതി അല്ലെങ്കിൽ സമയ തരം ഉള്ള ഒരു മൂല്യം ഇടവേള സജ്ജമാക്കുകഅല്ലെങ്കിൽ ഈ ഡാറ്റാ തരത്തിന് അസാധുവാണ് (വിഭാഗത്തിൻ്റെ ആരംഭം കാണുക), ഈ തരത്തിനായുള്ള "null" എന്ന മൂല്യത്തിലേക്ക് പരിവർത്തനം ചെയ്യുന്നു. (സ്ഥാപിത ഇടവേളയുടെ അതിരുകൾക്കപ്പുറത്തേക്ക് പോകുന്ന ടൈപ്പ് ടൈപ്പിൻ്റെ മൂല്യങ്ങൾക്കാണ് അപവാദം, അവ അനുബന്ധ അതിർത്തി പോയിൻ്റിലേക്ക് വെട്ടിച്ചുരുക്കുന്നു. നിർദ്ദിഷ്ട ഇടവേള TIME). പട്ടിക 4.3 ൽ. ഓരോ കോളം തരത്തിനും "null" എന്ന മൂല്യത്തിനായുള്ള ഫോർമാറ്റുകൾ ഇതാ:
  • പൂജ്യം മൂല്യങ്ങൾ സവിശേഷമാണ്. അവ സംഭരിക്കാനോ റഫർ ചെയ്യാനോ, നിങ്ങൾക്ക് പട്ടികയിൽ നൽകിയിരിക്കുന്ന മൂല്യങ്ങൾ വ്യക്തമായി ഉപയോഗിക്കാം, അല്ലെങ്കിൽ നിങ്ങൾക്ക് എഴുതാൻ എളുപ്പമുള്ള "0" ഉപയോഗിക്കാം.
DATETIME, DATE, TIMESTAMP ഡാറ്റ തരങ്ങൾ

തീയതിയും സമയവും സംബന്ധിച്ച വിവരങ്ങൾ ഉൾക്കൊള്ളുന്ന മൂല്യങ്ങൾക്കായി DATETIME ഡാറ്റാ തരം ഉപയോഗിക്കുന്നു. MySQL "YYYY-MM-DD HH:MM:SS" ഫോർമാറ്റിൽ DATETIME മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു. പിന്തുണയ്‌ക്കുന്ന മൂല്യങ്ങളുടെ ശ്രേണി "1000-01-01 00:00:00" മുതൽ "9999-12-31 23:59:59" വരെയാണ്. ("പിന്തുണയുള്ളത്" എന്നാൽ മുമ്പത്തെ സമയ മൂല്യങ്ങളുള്ള മൂല്യങ്ങൾ ഇപ്പോഴും പ്രവർത്തിക്കുന്നുണ്ടെങ്കിലും, അവ സംഭരിക്കുകയും ശരിയായി പ്രദർശിപ്പിക്കുകയും ചെയ്യുമെന്നതിന് യാതൊരു ഉറപ്പുമില്ല).

സമയ ഭാഗമില്ലാതെ, തീയതി വിവരങ്ങൾ മാത്രമുള്ള മൂല്യങ്ങൾക്കായി DATE തരം ഉപയോഗിക്കുന്നു. MySQL "YYYY-MM-DD" ഫോർമാറ്റിൽ DATE മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു. പിന്തുണയ്‌ക്കുന്ന മൂല്യങ്ങളുടെ ശ്രേണി "1000-01-01" മുതൽ "9999-12-31" വരെയാണ്.

TIMESTAMP കോളം തരം ഉപയോഗിക്കാനാകുന്ന ഒരു ഡാറ്റ പ്രാതിനിധ്യ തരം നൽകുന്നു യാന്ത്രിക റെക്കോർഡിംഗ് INSERT അല്ലെങ്കിൽ UPDATE പ്രവർത്തനങ്ങൾ നടത്തുമ്പോൾ നിലവിലെ തീയതിയും സമയവും. നിങ്ങൾക്ക് ഒന്നിലധികം TIMESTAMP നിരകൾ ഉണ്ടെങ്കിൽ, ആദ്യത്തേത് മാത്രം സ്വയമേവ അപ്ഡേറ്റ് ചെയ്യപ്പെടും.

TIMESTAMP തരത്തിൻ്റെ ശേഷിക്കുന്ന (ആദ്യത്തേത് ഒഴികെ) നിരകൾക്കായി, നിങ്ങൾക്ക് നിലവിലെ തീയതിയിലേക്കും സമയത്തിലേക്കും മൂല്യം സജ്ജമാക്കാനും കഴിയും. ഇത് ചെയ്യുന്നതിന്, നിങ്ങൾ നിര NULL അല്ലെങ്കിൽ NOW() ആയി സജ്ജീകരിക്കേണ്ടതുണ്ട്.

ഏത് TIMESTAMP കോളവും (ആ തരത്തിലുള്ള ആദ്യ കോളം പോലും) നിലവിലെ തീയതിയും സമയവും അല്ലാതെ മറ്റൊരു മൂല്യത്തിലേക്ക് സജ്ജമാക്കാൻ കഴിയും. ആവശ്യമുള്ള മൂല്യത്തിലേക്ക് ഇത് വ്യക്തമായി സജ്ജീകരിച്ചാണ് ഇത് ചെയ്യുന്നത്. ഈ സ്വത്ത്ഉപയോഗിക്കാം, ഉദാഹരണത്തിന്, ഒരു വരി സൃഷ്ടിക്കുമ്പോൾ TIMESTAMP കോളം നിലവിലെ തീയതിയിലേക്കും സമയത്തിലേക്കും സജ്ജമാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, തുടർന്ന് നിങ്ങൾ ആ വരി അപ്‌ഡേറ്റ് ചെയ്യുമ്പോൾ, നിരയുടെ മൂല്യം മാറരുത്.

TIMESTAMP മൂല്യങ്ങൾ 1970-ൻ്റെ തുടക്കം മുതൽ 2037-ൽ ഒരു സെക്കൻഡ് റെസല്യൂഷനിൽ ചില മൂല്യങ്ങൾ വരെയാകാം. ഈ അളവുകൾ സംഖ്യാ മൂല്യങ്ങളായി ഔട്ട്പുട്ട് ചെയ്യുന്നു.

MySQL TIMESTAMP മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്ന ഡാറ്റ ഫോർമാറ്റ് കാണിച്ചിരിക്കുന്ന പ്രതീകങ്ങളുടെ എണ്ണത്തെ ആശ്രയിച്ചിരിക്കുന്നു. ഇത് പട്ടിക 4.4 ൽ ചിത്രീകരിച്ചിരിക്കുന്നു. പൂർണ്ണ ഫോർമാറ്റ് TIMESTAMP എന്നത് 14 ദശാംശ സ്ഥാനങ്ങളാണ്, എന്നാൽ ഒരു ചെറിയ ഔട്ട്‌പുട്ട് സ്‌ട്രിംഗ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് TIMESTAMP നിരകൾ സൃഷ്‌ടിക്കാം:

പട്ടിക 4.4. എക്‌സ്‌ട്രാക്‌റ്റുചെയ്‌ത അക്കങ്ങളുടെ എണ്ണത്തെ ആശ്രയിച്ച് TIMESTAMP ഡാറ്റ ഫോർമാറ്റ്
നിര തരം ഔട്ട്പുട്ട് ഫോർമാറ്റ്
ടൈംസ്റ്റാമ്പ്(14) YYYYMMDDHHMMSS
ടൈംസ്റ്റാമ്പ്(12) YYMMDDHHMMSS
ടൈംസ്റ്റാമ്പ്(10) YYMMDDHHMM
ടൈംസ്റ്റാമ്പ്(8) YYYYMMDD
ടൈംസ്റ്റാമ്പ്(6) YYMMDD
ടൈംസ്റ്റാമ്പ്(4) YYMM
ടൈംസ്റ്റാമ്പ്(2) YY

DATETIME, DATE, TIMESTAMP മൂല്യങ്ങൾ ഏതെങ്കിലുമൊന്നിലേക്ക് സജ്ജമാക്കാൻ കഴിയും സ്റ്റാൻഡേർഡ് സെറ്റ്ഫോർമാറ്റുകൾ:

  • "YYYY-MM-DD HH:MM:SS" ഫോർമാറ്റിലോ "YY-MM-DD HH:MM:SS" ഫോർമാറ്റിലോ ഒരു സ്ട്രിംഗ് ആയി. "ലൈറ്റ്വെയ്റ്റ്" വാക്യഘടന അനുവദനീയമാണ് - തീയതി അല്ലെങ്കിൽ സമയ വിഭാഗങ്ങളുടെ ഭാഗങ്ങൾക്കിടയിൽ നിങ്ങൾക്ക് ഏത് വിരാമചിഹ്നവും ഒരു സെപ്പറേറ്ററായി ഉപയോഗിക്കാം. ഉദാഹരണത്തിന്, "98-12-31 11:30:45", "98.12.31 11+30+45", "98/12/31 11*30*45", "98@12@31" എന്നീ മൂല്യങ്ങൾ 11^30^ 45" തുല്യമാണ്.
  • "YYYY-MM-DD" ഫോർമാറ്റിലോ "YY-MM-DD" ഫോർമാറ്റിലോ ഒരു സ്ട്രിംഗ് ആയി. ഒരു "കനംകുറഞ്ഞ" വാക്യഘടനയും ഇവിടെ സ്വീകാര്യമാണ്. ഉദാഹരണത്തിന്, "98-12-31", "98.12.31", "98/12/31", "98@12@31" എന്നീ മൂല്യങ്ങൾ തുല്യമാണ്.
  • "YYYYMMDDHHMMSS" ഫോർമാറ്റിലോ "YYMMDDHHMMSS" ഫോർമാറ്റിലോ ഡിലിമിറ്ററുകളില്ലാത്ത ഒരു സ്ട്രിംഗായി, സ്ട്രിംഗ് ഒരു തീയതിയായി മനസ്സിലാക്കിയാൽ. ഉദാഹരണത്തിന്, "19970523091528", "970523091528" എന്നീ മൂല്യങ്ങളെ "1997-05-23 09:15:28" എന്ന് വ്യാഖ്യാനിക്കാം, എന്നാൽ "971122129015" മൂല്യം അസാധുവാണ് (മിനിറ്റ് വിഭാഗത്തിൻ്റെ മൂല്യം അസംബന്ധമാണ്) ലേക്ക് "0000-00-00 00 :00:00."
  • "YYYYMMDD" ഫോർമാറ്റിലോ "YYMMDD" ഫോർമാറ്റിലോ ഡിലിമിറ്ററുകളില്ലാത്ത ഒരു സ്ട്രിംഗ് എന്ന നിലയിൽ, സ്ട്രിംഗ് ഒരു തീയതിയായി വ്യാഖ്യാനിക്കപ്പെടുന്നു. ഉദാഹരണത്തിന്, "19970523", "970523" എന്നീ മൂല്യങ്ങളെ "1997-05-23" എന്ന് വ്യാഖ്യാനിക്കാം, എന്നാൽ "971332" മൂല്യം അസാധുവാണ് (മാസവും ദിവസവും വിഭാഗ മൂല്യങ്ങൾ അർത്ഥശൂന്യമാണ്) കൂടാതെ " 0000-00-00".
  • YYYYMMDDHHMMSS എന്ന ഫോർമാറ്റിലോ YYMMDDHHMMSS എന്ന ഫോർമാറ്റിലോ ഉള്ള ഒരു സംഖ്യയായി, ആ സംഖ്യയെ തീയതിയായി വ്യാഖ്യാനിക്കുകയാണെങ്കിൽ. ഉദാഹരണത്തിന്, 19830905132800, 830905132800 എന്നീ മൂല്യങ്ങൾ "1983-09-05 13:28:00" ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു.
  • YYYYMMDD ഫോർമാറ്റിലോ YYMMDD ഫോർമാറ്റിലോ ഉള്ള ഒരു സംഖ്യയായി, സംഖ്യയെ തീയതിയായി വ്യാഖ്യാനിച്ചാൽ. ഉദാഹരണത്തിന്, 19830905, 830905 എന്നീ മൂല്യങ്ങൾ "1983-09-05" ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു.
  • DATETIME , DATE , അല്ലെങ്കിൽ TIMESTAMP ഡാറ്റാ തരങ്ങളുടെ (ഉദാഹരണത്തിന്, NOW() അല്ലെങ്കിൽ CURRENT_DATE() ഫംഗ്‌ഷനുകളുടെ പശ്ചാത്തലത്തിൽ സ്വീകാര്യമായ ഒരു മൂല്യം നൽകുന്ന ഒരു ഫംഗ്‌ഷൻ എക്‌സിക്യൂട്ട് ചെയ്‌തതിൻ്റെ ഫലമായി.
TIME ഡാറ്റ തരം

MySQL "HH:MM:SS" ഫോർമാറ്റിൽ TIME മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു (അല്ലെങ്കിൽ വലിയ മണിക്കൂർ മൂല്യങ്ങൾക്കായി "HHH:MM:SS" ഫോർമാറ്റിൽ). സമയ മൂല്യങ്ങൾ "-838:59:59" മുതൽ "838:59:59" വരെ വ്യത്യാസപ്പെടാം. ഒരു മൂല്യത്തിൻ്റെ "മണിക്കൂർ" ഭാഗം വളരെ വലുതായിരിക്കാനുള്ള കാരണം, TIME തരം പകലിൻ്റെ സമയത്തെ പ്രതിനിധീകരിക്കാൻ മാത്രമല്ല (അത് 24 മണിക്കൂറിൽ കുറവായിരിക്കണം) മാത്രമല്ല, മൊത്തം കഴിഞ്ഞ സമയത്തെ പ്രതിനിധീകരിക്കാനും ഉപയോഗിക്കാം എന്നതാണ്. രണ്ട് ഇവൻ്റുകൾ തമ്മിലുള്ള സമയ ഇടവേള (ഇത് 24 മണിക്കൂറിൽ കൂടുതലോ അല്ലെങ്കിൽ നെഗറ്റീവ് ആയിരിക്കാം).

TIME മൂല്യങ്ങൾ വിവിധ ഫോർമാറ്റുകളിൽ വ്യക്തമാക്കാം:

"D HH:MM:SS.fractional part" എന്ന ഫോർമാറ്റിലുള്ള ഒരു സ്ട്രിംഗ് ആയി (പ്രശ്നത്തിലുള്ള തരത്തിൻ്റെ ഒരു നിരയിൽ ഒരു മൂല്യത്തിൻ്റെ ഫ്രാക്ഷണൽ ഭാഗം സംഭരിക്കുന്നതിന് MySQL ഇതുവരെ പിന്തുണ നൽകുന്നില്ല എന്നത് ശ്രദ്ധിക്കുക). നിങ്ങൾക്ക് ഇനിപ്പറയുന്ന "കനംകുറഞ്ഞ" കാഴ്ചകളിലൊന്ന് ഉപയോഗിക്കാം: HH:MM:SS.ഫ്രാക്ഷണൽ ഭാഗം, HH:MM:SS , HH:MM , D HH:MM:SS , D HH:MM , D HH അല്ലെങ്കിൽ SS . ഇവിടെ D എന്നത് 0-33 മൂല്യങ്ങളുടെ പരിധിയിൽ നിന്നുള്ള ദിവസങ്ങളാണ്.

  • "HHMMSS" ഫോർമാറ്റിൽ ഡിലിമിറ്ററുകൾ ഇല്ലാത്ത ഒരു സ്ട്രിംഗ് എന്ന നിലയിൽ, സ്ട്രിംഗ് ഒരു തീയതിയായി വ്യാഖ്യാനിക്കപ്പെടുന്നു. ഉദാഹരണത്തിന്, "101112" മൂല്യം "10:11:12" ആയി മനസ്സിലാക്കുന്നു, എന്നാൽ "109712" മൂല്യം അസാധുവായിരിക്കും (മിനിറ്റ് സെക്ഷൻ മൂല്യം അസംബന്ധമാണ്) കൂടാതെ "00:00:00" ആയി പരിവർത്തനം ചെയ്യപ്പെടും.
  • HHMMSS ഫോർമാറ്റിലുള്ള ഒരു സംഖ്യ എന്ന നിലയിൽ, സ്ട്രിംഗ് ഒരു തീയതിയായി വ്യാഖ്യാനിക്കപ്പെടുന്നു. ഉദാഹരണത്തിന്, 101112 എന്ന മൂല്യം "10:11:12" ആയി മനസ്സിലാക്കുന്നു. MySQL ഇനിപ്പറയുന്നവയും മനസ്സിലാക്കുന്നു ഇതര ഫോർമാറ്റുകൾ: എസ്.എസ്
  • 1901 മുതൽ 2155 വരെയുള്ള ശ്രേണിയിലെ നാലക്ക സംഖ്യയായി.
  • "00" മുതൽ "99" വരെയുള്ള മൂല്യങ്ങളുടെ ശ്രേണിയിലെ രണ്ട് പ്രതീക സ്ട്രിംഗ് ആയി. "00" മുതൽ "69" വരെയും "70" മുതൽ "99" വരെയുള്ള ഇടവേളകളിലെ മൂല്യങ്ങൾ യഥാക്രമം 2000 മുതൽ 2069 വരെയും 1970 മുതൽ 1999 വരെയും ഇടവേളകളിൽ YEAR മൂല്യങ്ങളിലേക്ക് പരിവർത്തനം ചെയ്യുന്നു.
  • 1 മുതൽ 99 വരെയുള്ള ശ്രേണിയിൽ ഒരു രണ്ടക്ക സംഖ്യയായി. 1 മുതൽ 69 വരെയും 70 മുതൽ 99 വരെയും ശ്രേണികളിലെ മൂല്യങ്ങൾ 2001 മുതൽ 2069 വരെയും 1970 മുതൽ 1999 വരെയും ശ്രേണികളിലെ YEAR മൂല്യങ്ങളിലേക്ക് പരിവർത്തനം ചെയ്യുന്നു. യഥാക്രമം. നിങ്ങൾക്ക് "പൂജ്യം" നേരിട്ട് ഒരു സംഖ്യയായി വ്യക്തമാക്കാനും അതിനെ 2000 എന്ന് വ്യാഖ്യാനിക്കാനും കഴിയാത്തതിനാൽ രണ്ട് അക്ക സംഖ്യകൾക്കും രണ്ട് അക്ക സ്ട്രിംഗുകൾക്കുമുള്ള സ്‌പെയ്‌സിംഗ് അല്പം വ്യത്യസ്തമാണെന്ന കാര്യം ശ്രദ്ധിക്കുക. നിങ്ങൾ അത് "0" അല്ലെങ്കിൽ "00" അല്ലെങ്കിൽ അത് 0000 ആയി വ്യാഖ്യാനിക്കപ്പെടും.
  • YEAR ഡാറ്റാ തരത്തിൻ്റെ (NOW() പോലുള്ളവ) സന്ദർഭത്തിൽ സ്വീകാര്യമായ ഒരു മൂല്യം നൽകുന്ന ഒരു ഫംഗ്‌ഷൻ നടപ്പിലാക്കുന്നതിൻ്റെ ഫലമായി.

അസാധുവായ YEAR മൂല്യങ്ങൾ 0000 ആയി പരിവർത്തനം ചെയ്യുന്നു.

DATETIME, DATE, TIMESTAMP തരങ്ങൾ

DATETIME, DATE, TIMESTAMP തരങ്ങൾ പരസ്പരം ബന്ധപ്പെട്ടിരിക്കുന്നു. ഈ വിഭാഗം അവയുടെ സ്വഭാവസവിശേഷതകൾ വിവരിക്കുന്നു, അവ എങ്ങനെ സമാനമാണ്, അവ എങ്ങനെ വ്യത്യാസപ്പെട്ടിരിക്കുന്നു.
തീയതിയും സമയവും ഉൾപ്പെടുന്ന മൂല്യങ്ങൾ നിങ്ങൾക്ക് ആവശ്യമുള്ളപ്പോൾ DATETIME തരം ഉപയോഗിക്കുന്നു. MySQL TGGT-MM-DD HH:MM:SS ഫോർമാറ്റിൽ DATETIME മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു. ഇവയ്‌ക്കുള്ള പിന്തുണയ്‌ക്കുന്ന മൂല്യങ്ങളുടെ ശ്രേണി "1000-01-01 00:00:00" മുതൽ "9999- വരെയാണ്. 12-31 23:59 :59" (പിന്തുണയ്ക്കുന്നത് അർത്ഥമാക്കുന്നത് മുമ്പത്തെ മൂല്യങ്ങൾ പ്രവർത്തിച്ചേക്കാം, എന്നാൽ ഉറപ്പില്ല.)
സമയമില്ലാതെ, തീയതി മാത്രം ഉൾപ്പെടുന്ന മൂല്യങ്ങൾ നിങ്ങൾക്ക് ആവശ്യമുള്ളപ്പോൾ DATE തരം ഉപയോഗിക്കുന്നു. MySQL "YYYY-MM-DD" ഫോർമാറ്റിൽ DATETIME മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു. പിന്തുണയ്‌ക്കുന്ന ശ്രേണി CH000-01-0G മുതൽ "9999-12-31" വരെയാണ്.
TIMESTAMP കോളം തരത്തിന് MySQL-ൻ്റെ പതിപ്പിനെയും സെർവർ പ്രവർത്തിക്കുന്ന SQL മോഡിനെയും ആശ്രയിച്ചിരിക്കുന്ന നിരവധി പ്രോപ്പർട്ടികൾ ഉണ്ട്. ഈ സവിശേഷതകൾ പിന്നീട് ഈ വിഭാഗത്തിൽ വിവരിച്ചിരിക്കുന്നു.
പൊതുവായി അംഗീകരിക്കപ്പെട്ട ഏതെങ്കിലും ഫോർമാറ്റുകൾ ഉപയോഗിച്ച് നിങ്ങൾക്ക് DATETIME, DATE, TIMESTAMP തരങ്ങളുടെ മൂല്യങ്ങൾ വ്യക്തമാക്കാൻ കഴിയും:

  1. "YYYY-MM-DD HH:MM:SS" അല്ലെങ്കിൽ "YY-MM-DD HH:MM:SS" ഫോർമാറ്റിലുള്ള ഒരു സ്ട്രിംഗ് ആയി. റിലാക്‌സ്ഡ് വാക്യഘടന അനുവദനീയമാണ്: തീയതിക്കും സമയത്തിനും ഇടയിലുള്ള ഡിലിമിറ്ററായി ഏത് ചിഹ്ന ചിഹ്നവും ഉപയോഗിക്കാം. ഉദാഹരണത്തിന്, "98-12-31 11:30:45", "98.12.31 11+30+45", "98/12/31 11*30*45", "98012031 11Л30Л45" എന്നിവ തുല്യമാണ്.
  2. "YYYY-MM-DD" അല്ലെങ്കിൽ "YY-MM-DD" ഫോർമാറ്റിലുള്ള ഒരു സ്ട്രിംഗ് ആയി. അയഞ്ഞ വാക്യഘടനയും അനുവദനീയമാണ്. ഉദാഹരണത്തിന്, തുല്യമായത് ഇനിപ്പറയുന്ന മൂല്യങ്ങൾ: "98-12-31","98.12.31","98/12/31", "98012031".
  3. "YYYYMMDDHHMMSS" അല്ലെങ്കിൽ "YYMMDDDHHMMSS" ഫോർമാറ്റിൽ ഡിലിമിറ്ററുകൾ ഇല്ലാത്ത ഒരു സ്ട്രിംഗ് ആയി, സ്ട്രിംഗ് ഒരു തീയതിയായി അർത്ഥമാക്കുന്നു. ഉദാഹരണത്തിന്, "19970523091528", "970523091528" എന്നിവ "1997-0 5-23 09:15:28" ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു, എന്നാൽ "971122129015" തെറ്റാണ് (അതിന് അർത്ഥമില്ലാത്ത മിനിറ്റുകളുടെ മൂല്യം ഉള്ളതിനാൽ)-0 "00000 ആയി മാറുന്നു 00:00": 00".
  4. "YYYYMMDD" അല്ലെങ്കിൽ TGMMDD ഫോർമാറ്റിലുള്ള ഒരു പരിധിയില്ലാത്ത സ്ട്രിംഗ് എന്ന നിലയിൽ, സ്ട്രിംഗ് ഒരു തീയതിയായി അർത്ഥമാക്കുന്നു. ഉദാഹരണത്തിന്, "19970523", "980523" എന്നിവ "1997-05-23" ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു, എന്നാൽ "971332" തെറ്റായ ( തെറ്റായ മൂല്യംമാസവും ദിവസവും) കൂടാതെ "0000-00-00" ആയി മാറുന്നു.
  5. YYYYMMDDDHHMMSS അല്ലെങ്കിൽ YYMMDDDHHMMSS ഫോർമാറ്റിലുള്ള ഒരു സംഖ്യ എന്ന നിലയിൽ, സംഖ്യ ഒരു തീയതിയായി അർത്ഥമാക്കുന്നു. ഉദാഹരണത്തിന്, 19830905132800, 830905132800 എന്നിവ "1983-09-05 13:28:00" എന്ന് വ്യാഖ്യാനിക്കപ്പെടുന്നു.
  6. YYYYMMDD അല്ലെങ്കിൽ YYMMDD ഫോർമാറ്റിലുള്ള ഒരു സംഖ്യ എന്ന നിലയിൽ, സംഖ്യ ഒരു തീയതിയായി അർത്ഥമാക്കുന്നു. ഉദാഹരണത്തിന്, 19830905, 830905 എന്നിവ "1983-09-05" ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു.
  7. NOW() അല്ലെങ്കിൽ CURRENT_DATE പോലുള്ള DATETIME, DATE അല്ലെങ്കിൽ TIMESTAMP സന്ദർഭത്തിൽ സ്വീകാര്യമായ ഒരു മൂല്യം നൽകുന്ന ഒരു ഫംഗ്‌ഷൻ്റെ ഫലമായി.

അസാധുവായ DATETIME, DATE അല്ലെങ്കിൽ TIMESTAMP മൂല്യങ്ങൾ ഉചിതമായ തരത്തിലുള്ള ("0000-00-00 00:00:00", "0000-00-00" അല്ലെങ്കിൽ 000000000000000000000000000000) അസാധുവായ മൂല്യങ്ങളിലേക്ക് പരിവർത്തനം ചെയ്യപ്പെടുന്നു.
തീയതി സെപ്പറേറ്റർ ഉൾപ്പെടുന്ന ഒരു സ്ട്രിംഗായി വ്യക്തമാക്കിയ മൂല്യങ്ങൾക്ക്, 10-ൽ താഴെയുള്ള മാസത്തിനോ ദിവസത്തിനോ രണ്ട് അക്കങ്ങൾ വ്യക്തമാക്കേണ്ടതില്ല. "1976-6-9" എന്നത് "1976-06-09" എന്നതിന് തുല്യമാണ്. . അതുപോലെ, ടൈം സെപ്പറേറ്റർ ഉൾപ്പെടുന്ന ഒരു സ്‌ട്രിംഗായി വ്യക്തമാക്കിയ മൂല്യങ്ങൾക്ക്, 10-ൽ താഴെയുള്ള മണിക്കൂറുകൾക്കും മിനിറ്റുകൾക്കും സെക്കൻഡുകൾക്കുമായി നിങ്ങൾ രണ്ട് അക്കങ്ങൾ വ്യക്തമാക്കേണ്ടതില്ല. "1979-10-30 1:2:3" ആണ് "1979-10-30 01:02:03" പോലെ തന്നെ.


ഒരു സംഖ്യയായി വ്യക്തമാക്കിയ മൂല്യങ്ങൾ 6, 8, 12 അല്ലെങ്കിൽ 14 അക്കങ്ങൾ നീളമുള്ളതായിരിക്കണം. ഒരു സംഖ്യയ്ക്ക് 8 അല്ലെങ്കിൽ 14 അക്കങ്ങൾ നീളമുണ്ടെങ്കിൽ, അത് YYYYMMDD അല്ലെങ്കിൽ YYYYMMDDDHHMMSS എന്ന ഫോർമാറ്റിൽ ഒരു മൂല്യം വ്യക്തമാക്കുമെന്നും വർഷം നാല് അക്കങ്ങളിൽ വ്യക്തമാക്കിയിട്ടുണ്ടെന്നും അനുമാനിക്കപ്പെടുന്നു. സംഖ്യയ്ക്ക് 6 അല്ലെങ്കിൽ 12 നീളമുണ്ടെങ്കിൽ, അത് YYMMDD അല്ലെങ്കിൽ YYMMDDDHHMMSS എന്ന ഫോർമാറ്റിൽ ഒരു മൂല്യം വ്യക്തമാക്കുമെന്ന് അനുമാനിക്കുകയും വർഷം രണ്ട് അക്കങ്ങളിൽ വ്യക്തമാക്കുകയും ചെയ്യുന്നു. 6, 8, 12, 14 എന്നിവയിൽ നിന്ന് നീളം വ്യത്യാസമുള്ള സംഖ്യകൾ, നിർദ്ദിഷ്ട ശ്രേണിയിലെ ഏറ്റവും അടുത്തുള്ള അക്കങ്ങളുടെ എണ്ണത്തിലേക്കുള്ള പൂജ്യങ്ങൾ കൊണ്ട് പാഡ് ചെയ്തിരിക്കുന്നു.

പരിധിയില്ലാത്ത സ്ട്രിംഗായി വ്യക്തമാക്കിയ മൂല്യങ്ങൾ മുകളിൽ വിവരിച്ചതുപോലെ അവയുടെ നീളം ഉപയോഗിച്ച് വ്യാഖ്യാനിക്കുന്നു. സ്ട്രിംഗിന് 8 അല്ലെങ്കിൽ 14 പ്രതീകങ്ങൾ നീളമുണ്ടെങ്കിൽ, വർഷം 4-അക്ക ഫോർമാറ്റിലാണെന്ന് അനുമാനിക്കാം. അല്ലാത്തപക്ഷം, ആദ്യത്തെ രണ്ട് അക്കങ്ങൾ കൊണ്ട് വർഷം നൽകിയിട്ടുണ്ടെന്ന് അനുമാനിക്കാം. വർഷം, മാസം, ദിവസം, മണിക്കൂർ, മിനിറ്റ്, സെക്കൻഡ് എന്നിവയുടെ മൂല്യങ്ങൾ വേർതിരിച്ചെടുക്കാൻ സ്ട്രിംഗ് ഇടത്തുനിന്ന് വലത്തോട്ട് വ്യാഖ്യാനിക്കുന്നു. ഇതിനർത്ഥം നിങ്ങൾ 6 പ്രതീകങ്ങളിൽ താഴെയുള്ള വരികൾ ഉപയോഗിക്കരുത് എന്നാണ്. ഉദാഹരണത്തിന്, നിങ്ങൾ 1999 മാർച്ച് അർത്ഥമാക്കുന്ന "9903" എന്ന് വ്യക്തമാക്കുകയാണെങ്കിൽ, MySQL പട്ടികയിൽ ഒരു അസാധുവായ തീയതി ചേർക്കുമെന്ന് നിങ്ങൾ കണ്ടെത്തും. വർഷത്തിൻ്റെയും മാസത്തിൻ്റെയും മൂല്യങ്ങൾ 99 ഉം 03 ഉം ആയതിനാൽ ഇത് സംഭവിക്കുന്നു, എന്നാൽ ദിവസത്തിൻ്റെ ഭാഗം പൂർണ്ണമായും കാണുന്നില്ല, അതായത് ഈ മൂല്യം ശരിയായ തീയതി സജ്ജീകരിക്കുന്നില്ല. എന്നിരുന്നാലും, MySQL 3.23 പോലെ, നിങ്ങൾക്ക് വ്യക്തമായി വ്യക്തമാക്കാൻ കഴിയും ശൂന്യമായ മൂല്യംമാസം അല്ലെങ്കിൽ ദിവസം. ഉദാഹരണത്തിന്, പട്ടികയിൽ "1999-03-00" മൂല്യം ചേർക്കുന്നതിന് നിങ്ങൾക്ക് "990300" വ്യക്തമാക്കാം.
ചില പരിധികൾക്കുള്ളിൽ, നിങ്ങൾക്ക് ഒരു തരത്തിലുള്ള മൂല്യങ്ങൾ മറ്റൊരു തരത്തിലുള്ള ഒബ്ജക്റ്റുകൾക്ക് നൽകാം. എന്നിരുന്നാലും, വിവരങ്ങൾ നഷ്ടപ്പെടുന്ന ചില വികലങ്ങൾ സാധ്യമാണ്:

  1. DATETIME അല്ലെങ്കിൽ TIMESTAMP എന്ന തരത്തിലുള്ള ഒബ്‌ജക്‌റ്റിന് നിങ്ങൾ DATE ടൈപ്പിൻ്റെ ഒരു മൂല്യം നൽകുകയാണെങ്കിൽ, DATE മൂല്യങ്ങളിൽ സമയ വിവരങ്ങൾ അടങ്ങിയിട്ടില്ലാത്തതിനാൽ മൂല്യത്തിൻ്റെ സമയ ഭാഗം "00:00:00" ആയി കണക്കാക്കും.
  2. DATE എന്ന തരത്തിലുള്ള ഒബ്‌ജക്‌റ്റിന് നിങ്ങൾ DATETIME അല്ലെങ്കിൽ tiMesTAMP എന്നതിൻ്റെ ഒരു മൂല്യം നൽകുകയാണെങ്കിൽ, DATE-ന് അത് ഉൾപ്പെടുത്താൻ കഴിയാത്തതിനാൽ മൂല്യത്തിൻ്റെ സമയ ഭാഗം നഷ്‌ടമാകും.
  3. ഓർക്കുക, DATETIME, DATE, TIMESTAMP മൂല്യങ്ങൾ ഒരേ ഫോർമാറ്റുകൾ ഉപയോഗിച്ച് വ്യക്തമാക്കാമെങ്കിലും, അവയുടെ സാധുതയുള്ള ശ്രേണികൾ വ്യത്യാസപ്പെട്ടിരിക്കുന്നു. ഉദാഹരണത്തിന്, TIMESTAMP മൂല്യങ്ങൾ 1970-ന് മുമ്പോ 2037-ന് ശേഷമോ ആയിരിക്കരുത്. ഇതിനർത്ഥം "1968-01-10" പോലെയുള്ള ഒരു തീയതി, DATETIME അല്ലെങ്കിൽ DATE മൂല്യം പോലെ മികച്ചതാണ്, ഒരു TIMESTAMP ആയി തെറ്റാണ്, അത്തരം ഒരു ഒബ്‌ജക്റ്റിലേക്ക് അസൈൻ ചെയ്യുമ്പോൾ അത് 0 ആയി പരിവർത്തനം ചെയ്യപ്പെടും.

തീയതി മൂല്യങ്ങൾ വ്യക്തമാക്കുമ്പോൾ ചില പോരായ്മകളെക്കുറിച്ചും നിങ്ങൾ അറിഞ്ഞിരിക്കണം:

  1. സ്ട്രിംഗുകളായി നൽകിയിരിക്കുന്ന മൂല്യങ്ങളുടെ അയഞ്ഞ ഫോർമാറ്റ് തെറ്റിദ്ധരിപ്പിക്കുന്നതാണ്. ഉദാഹരണത്തിന്, ":" ഡിലിമിറ്റർ ഉപയോഗിക്കുന്നതിനാൽ "10:11:12" പോലെയുള്ള ഒരു മൂല്യം ഒരു സമയമായി തോന്നിയേക്കാം, എന്നാൽ ഒരു തീയതി സന്ദർഭത്തിൽ ഉപയോഗിക്കുകയാണെങ്കിൽ അത് "2010-11-12" ആയി വ്യാഖ്യാനിക്കപ്പെടും. അതേ സമയം മൂല്യം "10:45:15"
    "45" ഒരു സാധുവായ മാസമല്ലാത്തതിനാൽ "0000-00-00" ആയി പരിവർത്തനം ചെയ്യും.
  2. MySQL സെർവർ അടിസ്ഥാന തീയതി മൂല്യനിർണ്ണയം മാത്രമേ നിർവഹിക്കുന്നുള്ളൂ: വർഷം, മാസം, ദിവസ ശ്രേണികൾ യഥാക്രമം 1000 മുതൽ 9999, 00 മുതൽ 12 വരെ, 00 മുതൽ 31 വരെ. -00". "2002-04-31" പോലെയുള്ള അസാധുവായ തീയതികൾ സംഭരിക്കാൻ ഇത് നിങ്ങളെ അനുവദിക്കുന്നു എന്ന കാര്യം ശ്രദ്ധിക്കുക. തീയതി ശരിയാണെന്ന് ഉറപ്പാക്കാൻ, ആപ്ലിക്കേഷനിൽ പരിശോധിക്കുക.
  • നൂറ്റാണ്ട് അജ്ഞാതമായതിനാൽ രണ്ടക്ക വർഷം അടങ്ങിയിരിക്കുന്ന തീയതികൾ അവ്യക്തമാണ്. MySQL രണ്ട് അക്ക വർഷങ്ങളെ ഇനിപ്പറയുന്ന രീതിയിൽ വ്യാഖ്യാനിക്കുന്നു: * 00-69 ശ്രേണിയിലുള്ള ഒരു വർഷം 2000-2069 ആയി പരിവർത്തനം ചെയ്യപ്പെടുന്നു.
  • 70-99 ശ്രേണിയിലുള്ള ഒരു വർഷം 1970-1999 ആയി പരിവർത്തനം ചെയ്യപ്പെടുന്നു.
4.1-നേക്കാൾ മുമ്പുള്ള MySQL പതിപ്പുകളിലെ TIMESTAMP പ്രോപ്പർട്ടികൾ
TIMESTAMP എന്നത് ഒരു അപ്‌ഡേറ്റ് അല്ലെങ്കിൽ ഇൻസേർട്ട് ഓപ്പറേഷൻ നടത്തുമ്പോൾ നിലവിലെ തീയതിയും സമയവും സ്വയമേവ സ്റ്റാമ്പ് ചെയ്യാൻ ഉപയോഗിക്കാവുന്ന ഒരു കോളം തരമാണ്. ഒരു പട്ടികയിൽ നിരവധി TIMESTAMP നിരകൾ ഉണ്ടെങ്കിൽ, ആദ്യത്തേത് മാത്രം സ്വയമേവ അപ്ഡേറ്റ് ചെയ്യപ്പെടും.
ഇനിപ്പറയുന്ന വ്യവസ്ഥകളിലൊന്ന് സംഭവിക്കുമ്പോൾ പട്ടികയിലെ ആദ്യത്തെ TIMESTAMP കോളം സ്വയമേവ അപ്‌ഡേറ്റ് ചെയ്യപ്പെടും:
  1. അതിന് NULL എന്ന മൂല്യം വ്യക്തമായി നൽകുമ്പോൾ.
  2. INSERT അല്ലെങ്കിൽ LOAD DATA INFILE പ്രസ്താവനയിൽ കോളം വ്യക്തമായി വ്യക്തമാക്കിയിട്ടില്ല.
  3. അപ്‌ഡേറ്റ് പ്രസ്താവനയിൽ കോളം വ്യക്തമായി വ്യക്തമാക്കിയിട്ടില്ല, എന്നാൽ മറ്റ് ചില കോളത്തിൻ്റെ മൂല്യം മാറിയിരിക്കുന്നു. ഒരു കോളം മുമ്പ് ഉണ്ടായിരുന്ന അതേ മൂല്യത്തിലേക്ക് സജ്ജീകരിക്കുന്ന അപ്‌ഡേറ്റ് സ്റ്റേറ്റ്‌മെൻ്റ് TIMESTAMP കോളം അപ്‌ഡേറ്റ് ചെയ്യുന്നില്ല. നിങ്ങൾ ഒരു പഴയ മൂല്യം നൽകുകയാണെങ്കിൽ, കാര്യക്ഷമത കാരണങ്ങളാൽ MySQL അത് അവഗണിക്കുന്നു.

TIMESTAMP നിരകൾ ആവശ്യമുള്ള മൂല്യത്തിലേക്ക് വ്യക്തമായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, നിലവിലെ തീയതിയും സമയവും ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ചെയ്യാനും കഴിയും. ആദ്യത്തെ TIMESTAMP കോളത്തിന് പോലും ഇത് ശരിയാണ്. നിങ്ങൾക്ക് ഒരു കോളത്തിൻ്റെ മൂല്യം സജ്ജീകരിക്കണമെങ്കിൽ ഉദാഹരണമായി ഈ പ്രോപ്പർട്ടി ഉപയോഗിക്കാം നിലവിലെ തീയതിഒപ്പം വരി സൃഷ്‌ടിക്കുന്ന സമയവും, എന്നാൽ വരിയിലേക്കുള്ള തുടർന്നുള്ള അപ്‌ഡേറ്റുകളിൽ അത് മാറ്റരുത്:

  1. വരി സൃഷ്ടിക്കുമ്പോൾ കോളത്തിൻ്റെ മൂല്യം സജ്ജമാക്കാൻ MySQL അനുവദിക്കുക. ഇത് നിലവിലെ തീയതിയും സമയ മൂല്യവും ഉപയോഗിച്ച് ഇത് ആരംഭിക്കുന്നു.
  2. മറ്റ് വരി നിരകളിലേക്ക് തുടർന്നുള്ള അപ്‌ഡേറ്റുകൾ നടത്തുമ്പോൾ, TIMESTAMP കോളം അതിൻ്റെ നിലവിലെ മൂല്യത്തിലേക്ക് സജ്ജമാക്കുക:

അപ്ഡേറ്റ് ചെയ്യുക പട്ടിക_പേര്
സെറ്റ് കോളം_ imes tamp- column_Ytestamp, other_column1 = new_value1, other_column2= new_objection2, ...
ഒരു വരി സൃഷ്‌ടിച്ച സമയം രേഖപ്പെടുത്തുന്ന ഒരു കോളം നിലനിർത്തുന്നതിനുള്ള മറ്റൊരു മാർഗ്ഗം, DATETIME കോളം ഉപയോഗിക്കുക എന്നതാണ്, അത് വരി സൃഷ്‌ടിക്കുമ്പോൾ NOW() ലേക്ക് ആരംഭിക്കുകയും അതിനുശേഷം പരിഷ്‌ക്കരിക്കാതിരിക്കുകയും ചെയ്യുന്നു.
TIMESTAMP മൂല്യങ്ങൾ 1970 ൻ്റെ ആരംഭം മുതൽ 2037 ൻ്റെ ഭാഗം വരെ ഒരു സെക്കൻഡ് റെസല്യൂഷനിൽ വ്യത്യാസപ്പെടാം. മൂല്യങ്ങൾ അക്കങ്ങളായി പ്രദർശിപ്പിക്കും.
MySQL TIMESTAMP മൂല്യങ്ങൾ വീണ്ടെടുക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്ന ഫോർമാറ്റ്, പട്ടിക 1 ൽ ചിത്രീകരിച്ചിരിക്കുന്നതുപോലെ ഡിസ്പ്ലേ വീതിയെ ആശ്രയിച്ചിരിക്കുന്നു. 4.3 മുഴുവൻ TIMESTAMP ഫോർമാറ്റും 14 ബിറ്റുകൾ നീളമുള്ളതാണ്, എന്നാൽ TIMESTAMP നിരകൾ ഒരു ചെറിയ ഡിസ്പ്ലേ ഫോർമാറ്റിൽ നിർവചിക്കാം.

വീതിയിൽ ഡിസ്പ്ലേ ഫോർമാറ്റിൻ്റെ പട്ടിക ആശ്രിതത്വം

ഡിസ്പ്ലേ ഫോർമാറ്റ് പരിഗണിക്കാതെ തന്നെ എല്ലാ TIMESTAMP നിരകൾക്കും ഒരേ സംഭരണ ​​വലുപ്പമുണ്ട്. ഏറ്റവും സാധാരണയായി ഉപയോഗിക്കുന്ന ഫോർമാറ്റുകൾ 6, 8, 12, 14 പ്രതീകങ്ങളാണ്. നിങ്ങൾക്ക് ചോദിക്കാം ഇഷ്ടാനുസൃത വലുപ്പംപട്ടിക സൃഷ്‌ടിക്കുമ്പോൾ പ്രദർശിപ്പിക്കുക, എന്നാൽ 0-ഉം 14-ൽ കൂടുതലും ഉള്ള മൂല്യങ്ങൾ 14-ലേക്ക് കാസ്‌റ്റ് ചെയ്‌തിരിക്കുന്നു. 1 മുതൽ 13 വരെയുള്ള ഒറ്റമൂല്യം ഏറ്റവും അടുത്തുള്ള ഇരട്ട സംഖ്യയിലേക്ക് കാസ്‌റ്റ് ചെയ്‌തിരിക്കുന്നു.
TIMESTAMP നിരകൾ പ്രദർശനത്തിൻ്റെ വീതി പരിഗണിക്കാതെ തന്നെ അവ വ്യക്തമാക്കിയ പൂർണ്ണ കൃത്യത ഉപയോഗിച്ച് സാധുവായ മൂല്യങ്ങൾ സംഭരിക്കുന്നു. എന്നിരുന്നാലും, ഇതുമായി ബന്ധപ്പെട്ട ചില പരിമിതികളുണ്ട്:

  1. കോളം TIMESTAMP(4) അല്ലെങ്കിൽ TIMESTAMP(2) ആയി പ്രഖ്യാപിച്ചിട്ടുണ്ടെങ്കിലും, നിങ്ങൾ എല്ലായ്പ്പോഴും വർഷം, മാസം, ദിവസം എന്നിവ വ്യക്തമാക്കണം. അല്ലെങ്കിൽ, മൂല്യം തെറ്റായി കണക്കാക്കുകയും 0-ൽ സംഭരിക്കുകയും ചെയ്യും.
  2. നിങ്ങൾ ഉപയോഗിക്കുന്നുണ്ടെങ്കിൽ ALTER പട്ടിക TIMESTAMP കോളം വികസിപ്പിക്കുന്നതിന്, മുമ്പ് മറച്ചിരുന്ന വിവരങ്ങൾ ഹൈലൈറ്റ് ചെയ്യും.
  3. അതുപോലെ, നിങ്ങൾ ഒരു TIMESTAMP കോളം ചുരുക്കുമ്പോൾ, ഒരു വിവരവും നഷ്‌ടമാകില്ല, മുമ്പത്തേതിനേക്കാൾ കുറച്ച് വിവരങ്ങൾ മാത്രമേ ഔട്ട്‌പുട്ട് ചെയ്യപ്പെടുകയുള്ളൂ എന്ന അർത്ഥത്തിലല്ലാതെ.
  4. TIMESTAMP നിരകൾ പൂർണ്ണ കൃത്യതയോടെ സംഭരിച്ചിട്ടുണ്ടെങ്കിലും, അവയിൽ സംഭരിച്ചിരിക്കുന്ന മുഴുവൻ വിവരങ്ങളിലും പ്രവർത്തിക്കുന്ന ഒരേയൊരു പ്രവർത്തനം UNIX_TIMESTAMP() ആണ്. മറ്റെല്ലാ ഫംഗ്‌ഷനുകളും ഫോർമാറ്റ് ചെയ്‌ത എക്‌സ്‌ട്രാക്റ്റുചെയ്‌ത മൂല്യത്തിൽ പ്രവർത്തിക്കുന്നു. കോളത്തിൻ്റെ ഫോർമാറ്റ് ചെയ്‌ത മൂല്യത്തിൽ അനുബന്ധ ഭാഗം ഉൾപ്പെടുത്തിയില്ലെങ്കിൽ നിങ്ങൾക്ക് HOUR() അല്ലെങ്കിൽ SECOND() പോലുള്ള ഒരു ഫംഗ്‌ഷൻ ഉപയോഗിക്കാൻ കഴിയില്ല എന്നാണ് ഇതിനർത്ഥം. ഉദാഹരണത്തിന്, ഒരു TIMESTAMP നിരയുടെ HH ഭാഗം അതിൻ്റെ ഡിസ്പ്ലേ വീതി കുറഞ്ഞത് 10 ആണെങ്കിൽ പ്രദർശിപ്പിക്കില്ല, അതിനാൽ HOURO എന്നത് ചെറിയ TIMESTAMP മൂല്യങ്ങളിലേക്ക് പ്രയോഗിക്കുന്നത് അർത്ഥശൂന്യമായ ഫലം നൽകും.
MySQL പതിപ്പ് 4.1-ലും അതിലും ഉയർന്നതിലുമുള്ള TIMESTAMP പ്രോപ്പർട്ടികൾ
MySQL 4.1 മുതൽ, TIMESTAMP പ്രോപ്പർട്ടികൾ മുമ്പത്തെ പതിപ്പുകളിൽ നിന്ന് വ്യത്യസ്തമാണ്: TIMESTAMP നിരകൾ DATETIME കോളങ്ങളുടെ അതേ ഫോർമാറ്റിൽ പ്രദർശിപ്പിക്കും.
  • മുമ്പ് വിവരിച്ചതുപോലെ ഡിസ്പ്ലേ വീതി ഇനി പിന്തുണയ്ക്കില്ല. മറ്റൊരു വിധത്തിൽ പറഞ്ഞാൽ, നിങ്ങൾക്ക് ഇനി TIMESTAMP(4) അല്ലെങ്കിൽ TIMESTAMP(2) ഉപയോഗിക്കാൻ കഴിയില്ല. കൂടാതെ, എങ്കിൽ MySQL സെർവർ MAXDB മോഡിൽ സമാരംഭിച്ചു, TIMESTAMP തരം തീയതി സമയത്തിന് സമാനമാണ്. അതായത്, പട്ടിക സൃഷ്ടിക്കുന്ന സമയത്ത് സെർവർ MAXDB മോഡിലാണ് പ്രവർത്തിക്കുന്നതെങ്കിൽ, ഏതെങ്കിലും TIMESTAMP നിരകൾ DATETIME ആയി സൃഷ്ടിക്കപ്പെടും. തൽഫലമായി, ഈ നിരകൾ DATETIME ഡിസ്‌പ്ലേ ഫോർമാറ്റ് ഉപയോഗിക്കുന്നു, സാധുതയുള്ള മൂല്യങ്ങളുടെ സമാന ശ്രേണിയുണ്ട്, കൂടാതെ ഇല്ല യാന്ത്രിക അപ്ഡേറ്റ്സംഭവിക്കുന്നില്ല.
MAXDB മോഡിൽ, പതിപ്പ് 4.1.1 മുതൽ MySQL സെർവർ സമാരംഭിക്കാനാകും. ഈ മോഡ് പ്രവർത്തനക്ഷമമാക്കാൻ, സെർവർ ആരംഭിക്കുമ്പോൾ -sql-mode=MAXDB ഓപ്ഷൻ വ്യക്തമാക്കുക, അല്ലെങ്കിൽ റൺടൈമിൽ sqljnode ഗ്ലോബൽ വേരിയബിളിൻ്റെ മൂല്യം സജ്ജമാക്കുക:
mysql SET GLOBAL sql_mode=MAXDB;
കമാൻഡ് ഉപയോഗിച്ച് സെർവറിന് സ്വന്തം സെഷനിൽ MAXDB മോഡിൽ പ്രവർത്തിക്കാൻ ഒരു ക്ലയൻ്റിനു കഴിയും:
mysql സെറ്റ് സെഷൻ sql_mode=MAXDB;

തുടക്കത്തിൽ ഒരു ഹ്രസ്വ വിവരണംഓരോ തരം:

  • TIMESTAMP - തീയതിയും സമയവും സംഭരിക്കുന്നതിനുള്ള ഡാറ്റ തരം. "യുണിക്സ് യുഗം" ആരംഭിച്ചതിന് ശേഷം കടന്നുപോയ സെക്കൻഡുകളുടെ എണ്ണമായാണ് ഡാറ്റ സംഭരിച്ചിരിക്കുന്നത്. മൂല്യ പരിധി: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. 4 ബൈറ്റുകൾ ഉൾക്കൊള്ളുന്നു.
  • വർഷം - വർഷം സംഭരിക്കുന്നതിനുള്ള ഡാറ്റ തരം. മൂല്യ ശ്രേണി: 1901 - 2155. 1 ബൈറ്റ് ഉൾക്കൊള്ളുന്നു.
  • തീയതികൾ സംഭരിക്കുന്നതിനുള്ള ഒരു ഡാറ്റ തരമാണ് DATE. മൂല്യ പരിധി: 1000-01-01 - 9999-12-31. 3 ബൈറ്റുകൾ ഉൾക്കൊള്ളുന്നു.
  • സമയം സംഭരിക്കുന്നതിനുള്ള ഒരു ഡാറ്റ തരമാണ് TIME. മൂല്യ പരിധി: −828:59:59 - 828:59:59. 3 ബൈറ്റുകൾ ഉൾക്കൊള്ളുന്നു.
  • തീയതിയും സമയവും സംഭരിക്കുന്നതിനുള്ള ഒരു ഡാറ്റാ തരമാണ് DATETIME. മൂല്യ പരിധി: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. 8 ബൈറ്റുകൾ ഉൾക്കൊള്ളുന്നു.

ഹോസ്റ്റസ് ശ്രദ്ധിക്കുക. "ടൈംസ്റ്റാമ്പ്" എന്ന ആശയം യുണിക്സ് സമയമാണെന്ന് മിക്ക പ്രോഗ്രാമർമാരും വിശ്വസിക്കുന്നു എന്നതാണ് രസകരമായ കാര്യം. വാസ്തവത്തിൽ, ഒരു നിശ്ചിത സംഭവം നടന്ന തീയതിയും കൂടാതെ/അല്ലെങ്കിൽ സമയവും സൂചിപ്പിക്കുന്ന പ്രതീകങ്ങളുടെ ഒരു ശ്രേണിയാണ് ടൈംസ്റ്റാമ്പ്. 1970 ജനുവരി 1, UTC അർദ്ധരാത്രി മുതൽ കടന്നുപോയ സെക്കൻഡുകളുടെ എണ്ണമാണ് “Unix time” (Unix time) അല്ലെങ്കിൽ POSIX സമയം. ടൈംസ്റ്റാമ്പ് എന്ന ആശയം യുണിക്സ് സമയത്തേക്കാൾ വിശാലമാണ്.

മുകളിൽ അവതരിപ്പിച്ച തരങ്ങളുടെ വിവരണം വിശകലനം ചെയ്ത ശേഷം, ചില തരങ്ങളുടെ ഗുണങ്ങളെയും ദോഷങ്ങളെയും കുറിച്ച് നിങ്ങൾക്ക് മിക്കവാറും എല്ലാ നിഗമനങ്ങളും വരയ്ക്കാം. എല്ലാം വളരെ ലളിതവും വ്യക്തവുമാണ്.

എന്നാൽ ഈ തരങ്ങളുടെ ഉപയോഗത്തെക്കുറിച്ച് സംസാരിക്കുന്നതിന് മുമ്പ്, പ്രായോഗികമായി, തീയതിയും സമയവും സംഭരിക്കുന്നതിന് മറ്റൊരു തരം പലപ്പോഴും ഉപയോഗിക്കപ്പെടുന്നുവെന്ന് ഞാൻ ശ്രദ്ധിക്കാൻ ആഗ്രഹിക്കുന്നു: ഒരു പൂർണ്ണസംഖ്യ മൂല്യം (തീയതി സംഭരിക്കുന്നതിന് - INT (4 ബൈറ്റുകൾ), തീയതിയും സമയവും - BIGINT (8 ബൈറ്റുകൾ)). ഉപയോഗത്തിലെ വ്യത്യാസം പൂർണ്ണസംഖ്യ തരങ്ങൾ DATE, DATETIME മുതൽ ഔട്ട്‌പുട്ട് സമയത്ത് ഡാറ്റ ഫോർമാറ്റ് ചെയ്യാത്തതിൽ മാത്രം, തീയതികളും സമയവും ഉള്ള കണക്കുകൂട്ടലുകളിൽ, പൂർണ്ണസംഖ്യകൾ ഉചിതമായ കലണ്ടർ തരത്തിലേക്ക് പരിവർത്തനം ചെയ്യണം. കൂടാതെ, സംരക്ഷിക്കുന്നതിന് മുമ്പ് അവതരിപ്പിച്ച മൂല്യത്തിൻ്റെ സാധുതയ്ക്കായി ഒരു പരിശോധനയും ഇല്ല. സോർട്ടിംഗ് കഴിവുകൾ നിലനിർത്തുന്നു. അതിനാൽ, DBMS-ൽ നിന്നുള്ള പോർട്ടബിലിറ്റിയും സ്വാതന്ത്ര്യവും പരമാവധി വർദ്ധിപ്പിക്കുന്നതിന്, DATE, DATETIME എന്നിവയിലെ അതേ സന്ദർഭങ്ങളിൽ INT, BIGINT എന്നിവ ഉപയോഗിക്കുന്നത് യുക്തിസഹമാണ്. മറ്റ് ഗുണങ്ങളൊന്നും ഞാൻ കാണുന്നില്ല; എന്തെങ്കിലും ഉണ്ടെങ്കിൽ, അഭിപ്രായങ്ങളിൽ അവ സൂചിപ്പിക്കാൻ ഞാൻ നിർദ്ദേശിക്കുന്നു.

MySQL-ൽ കലണ്ടർ ഡാറ്റ തരങ്ങൾ ഉപയോഗിക്കുന്നു

ഏറ്റവും ലളിതമായ - തരത്തിൽ നിന്ന് നമുക്ക് ആരംഭിക്കാം വർഷം. അതിൻ്റെ ഒരേയൊരു ഗുണം അതിൻ്റെ ചെറിയ വലിപ്പമാണ് - 1 ബൈറ്റ് മാത്രം. എന്നാൽ ഇക്കാരണത്താൽ, സാധുവായ മൂല്യങ്ങളുടെ ശ്രേണിയിൽ കർശനമായ നിയന്ത്രണമുണ്ട് (തരത്തിന് 255 മാത്രമേ സംഭരിക്കാൻ കഴിയൂ. വ്യത്യസ്ത അർത്ഥങ്ങൾ). 1901 മുതൽ 2155 വരെയുള്ള ശ്രേണിയിൽ വർഷങ്ങൾ കർശനമായി സംഭരിക്കാൻ ആഗ്രഹിക്കുന്ന ഒരു പ്രായോഗിക സാഹചര്യം സങ്കൽപ്പിക്കാൻ എനിക്ക് പ്രയാസമാണ്. കൂടാതെ, SMALLINT തരം (2 ബൈറ്റുകൾ) ഒരു വർഷം സംഭരിക്കാൻ മിക്ക സാഹചര്യങ്ങളിലും മതിയായ ശ്രേണി നൽകുന്നു. ഒരു ഡാറ്റാബേസ് പട്ടികയിൽ ഓരോ വരിയിലും 1 ബൈറ്റ് സംരക്ഷിക്കുന്നത് നമ്മുടെ കാലത്ത് അർത്ഥമാക്കുന്നില്ല.

തരങ്ങൾ തീയതിഒപ്പം തീയതി സമയംഒരു ഗ്രൂപ്പായി കൂട്ടിച്ചേർക്കാം. അവർ തീയതിയോ തീയതിയോ സമയമോ സംഭരിക്കുന്നു വിശാലമായ ശ്രേണിസ്വീകാര്യമായ മൂല്യങ്ങൾ, സെർവറിൽ സജ്ജീകരിച്ചിരിക്കുന്ന സമയമേഖലയിൽ നിന്ന് സ്വതന്ത്രമാണ്. അവരുടെ ഉപയോഗം തീർച്ചയായും പ്രായോഗിക അർത്ഥമുള്ളതാണ്. എന്നാൽ പൊതുയുഗത്തിനപ്പുറമുള്ള ചരിത്ര സംഭവങ്ങൾക്കായി നിങ്ങൾക്ക് തീയതികൾ സംഭരിക്കണമെങ്കിൽ, നിങ്ങൾ മറ്റ് ഡാറ്റ തരങ്ങൾ തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്. TIMESTAMP തരത്തിലുള്ള (ജന്മദിനങ്ങൾ, ഉൽപ്പന്ന റിലീസ് തീയതികൾ, പ്രസിഡൻ്റ് തിരഞ്ഞെടുപ്പ്, ബഹിരാകാശ റോക്കറ്റ് വിക്ഷേപണങ്ങൾ മുതലായവ) പരിധിക്ക് പുറത്തുള്ള ചില ഇവൻ്റുകൾക്കുള്ള തീയതികൾ സംഭരിക്കുന്നതിന് ഈ തരങ്ങൾ അനുയോജ്യമാണ്. ഈ തരങ്ങൾ ഉപയോഗിക്കുമ്പോൾ ശ്രദ്ധിക്കേണ്ട ഒരു കാര്യം പ്രധാനപ്പെട്ട സൂക്ഷ്മത, എന്നാൽ അതിനെക്കുറിച്ച് കൂടുതൽ താഴെ.

ടൈപ്പ് ചെയ്യുക സമയം 1 സെക്കൻഡിൽ കുറവ് കൃത്യത ആവശ്യമില്ലാത്ത സമയവും 829 മണിക്കൂറിൽ താഴെയുള്ള സമയ കാലയളവും സംഭരിക്കാൻ ഉപയോഗിക്കാം. ഇവിടെ കൂടുതലൊന്നും ചേർക്കാനില്ല.

ഏറ്റവും രസകരമായ തരം അവശേഷിക്കുന്നു - ടൈംസ്റ്റാമ്പ്. DATE, DATETIME എന്നിവയുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ ഇത് പരിഗണിക്കണം: ചില ഇവൻ്റുകളുടെ തീയതി കൂടാതെ/അല്ലെങ്കിൽ സമയവും സംഭരിക്കുന്നതിനാണ് TIMESTAMP രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്. അവയ്‌ക്കിടയിലുള്ള ഒരു പ്രധാന വ്യത്യാസം മൂല്യങ്ങളുടെ ശ്രേണിയിലാണ്: വ്യക്തമായും, ചരിത്ര സംഭവങ്ങൾ (ജന്മദിനങ്ങൾ പോലുള്ളവ) സംഭരിക്കുന്നതിന് TIMESTAMP അനുയോജ്യമല്ല, എന്നാൽ നിലവിലുള്ളവ സംഭരിക്കുന്നതിന് മികച്ചതാണ് (ലോഗിംഗ്, ലേഖനങ്ങൾ പോസ്റ്റുചെയ്യുന്ന തീയതികൾ, ഉൽപ്പന്നങ്ങൾ ചേർക്കൽ, ഓർഡറുകൾ സ്ഥാപിക്കൽ) ഭാവിയിലെ ഭാവി ഇവൻ്റുകളിൽ വരാനിരിക്കുന്നവയും (പുതിയ പതിപ്പ് റിലീസുകൾ, കലണ്ടറുകൾ, ഷെഡ്യൂളറുകൾ മുതലായവ).

TIMESTAMP തരം ഉപയോഗിക്കുന്നതിനുള്ള പ്രധാന സൗകര്യം, പട്ടികകളിലെ ഇത്തരത്തിലുള്ള നിരകൾക്കായി നിങ്ങൾക്ക് നിലവിലെ സമയത്തിന് പകരമായി ഒരു സ്ഥിരസ്ഥിതി മൂല്യം സജ്ജമാക്കാനും അതുപോലെ ഒരു റെക്കോർഡ് അപ്‌ഡേറ്റ് ചെയ്യുമ്പോൾ നിലവിലെ സമയം ക്രമീകരിക്കാനും കഴിയും എന്നതാണ്. നിങ്ങൾക്ക് ഈ ഫീച്ചറുകൾ ആവശ്യമുണ്ടെങ്കിൽ, നിങ്ങൾക്ക് ആവശ്യമുള്ളത് TIMESTAMP ആയിരിക്കാൻ 99% സാധ്യതയുണ്ട്. (ഇത് എങ്ങനെ ചെയ്യാമെന്നതിനുള്ള മാനുവൽ കാണുക.)

ഞങ്ങൾ 2038-ലേക്ക് അടുക്കുമ്പോൾ നിങ്ങളുടെ സോഫ്റ്റ്‌വെയർ പ്രവർത്തിക്കുന്നത് നിർത്തുമെന്ന് ഭയപ്പെടരുത്. ഒന്നാമതായി, ഈ സമയത്തിന് മുമ്പ്, നിങ്ങളുടെ സോഫ്‌റ്റ്‌വെയർ ഉപയോഗിക്കുന്നത് മിക്കവാറും നിർത്തപ്പെടും (പ്രത്യേകിച്ച് ഇപ്പോൾ എഴുതിക്കൊണ്ടിരിക്കുന്ന പതിപ്പുകൾ). രണ്ടാമതായി, ഈ തീയതി അടുക്കുമ്പോൾ, MySQL ഡെവലപ്പർമാർ തീർച്ചയായും നിങ്ങളുടെ സോഫ്റ്റ്‌വെയറിൻ്റെ പ്രവർത്തനക്ഷമത സംരക്ഷിക്കാൻ എന്തെങ്കിലും കൊണ്ടുവരും. Y2K പ്രശ്നം പോലെ എല്ലാം പരിഹരിക്കപ്പെടും.

അതിനാൽ, നമ്മുടെ കാലത്തെ ഇവൻ്റുകളുടെ തീയതികളും സമയങ്ങളും സംഭരിക്കുന്നതിന് ഞങ്ങൾ TIMESTAMP തരം ഉപയോഗിക്കുന്നു, കൂടാതെ ചരിത്ര സംഭവങ്ങളുടെ തീയതികളും സമയങ്ങളും അല്ലെങ്കിൽ ആഴത്തിലുള്ള ഭാവിയിലെ ഇവൻ്റുകളും സംഭരിക്കാൻ DATETIME, DATE എന്നിവ ഉപയോഗിക്കുന്നു.

മൂല്യ ശ്രേണികളാണ് പ്രധാന വ്യത്യാസം TIMESTAMP, DATETIME, DATE എന്നീ തരങ്ങൾക്കിടയിൽ, പക്ഷേ പ്രധാന കാര്യം അല്ല. പ്രധാന TIMESTAMP മൂല്യം UTC-യിൽ സംഭരിക്കുന്നു. ഒരു മൂല്യം സംഭരിക്കുമ്പോൾ, അത് നിലവിലെ സമയ മേഖലയിൽ നിന്ന് UTC ലേക്ക് വിവർത്തനം ചെയ്യപ്പെടുന്നു, അത് വായിക്കുമ്പോൾ, അത് UTC യിൽ നിന്ന് നിലവിലെ സമയ മേഖലയിൽ നിന്ന് വിവർത്തനം ചെയ്യുന്നു. സമയ മേഖലകൾ പരിഗണിക്കാതെ DATETIME, DATE എന്നിവ എല്ലായ്പ്പോഴും ഒരേ സമയം സംഭരിക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു.

സമയ മേഖലകൾ സജ്ജീകരിച്ചിരിക്കുന്നു MySQL DBMSആഗോളതലത്തിൽ അല്ലെങ്കിൽ നിലവിലെ കണക്ഷനായി.പിന്നീട് പ്രവർത്തനം ഉറപ്പാക്കാൻ ഉപയോഗിക്കാം വ്യത്യസ്ത ഉപയോക്താക്കൾ DBMS തലത്തിൽ വ്യത്യസ്ത സമയ മേഖലകളിൽ. എല്ലാ സമയ മൂല്യങ്ങളും യുടിസിയിൽ ഭൗതികമായി സംഭരിക്കുകയും ക്ലയൻ്റിൽ നിന്ന് സ്വീകരിക്കുകയും ക്ലയൻ്റിന് നൽകുകയും ചെയ്യും - അവൻ്റെ സമയ മേഖലയുടെ മൂല്യങ്ങളിൽ. എന്നാൽ TIMESTAMP ഡാറ്റ തരം ഉപയോഗിക്കുമ്പോൾ മാത്രം. DATE, DATETIME എന്നിവ എല്ലായ്പ്പോഴും ഒരേ മൂല്യം സ്വീകരിക്കുകയും സംഭരിക്കുകയും തിരികെ നൽകുകയും ചെയ്യുന്നു.

NOW() ഫംഗ്‌ഷനും അതിൻ്റെ പര്യായങ്ങളും ഉപയോക്താവിൻ്റെ നിലവിലെ സമയമേഖലയിലെ സമയ മൂല്യം നൽകുന്നു.

ഈ സാഹചര്യങ്ങളെല്ലാം കണക്കിലെടുത്ത്, സെർവറിലേക്കുള്ള കണക്ഷനുള്ള സമയ മേഖല മാറ്റുമ്പോഴും DATE, DATETIME തരങ്ങൾ ഉപയോഗിക്കുമ്പോഴും നിങ്ങൾ അതീവ ജാഗ്രത പാലിക്കണം. നിങ്ങൾക്ക് ഒരു തീയതി സൂക്ഷിക്കണമെങ്കിൽ (ഉദാഹരണത്തിന്, ജനനത്തീയതി), പിന്നെ പ്രശ്നങ്ങളൊന്നും ഉണ്ടാകില്ല. ഏത് സോണിലും ജനനത്തീയതി ഒന്നുതന്നെയാണ്. ആ. നിങ്ങൾ ജനുവരി 1-ന് 0:00 UTC/GMT+0-നാണ് ജനിച്ചതെങ്കിൽ, ഇത് അല്ലഅതിനർത്ഥം അമേരിക്കയിൽ അവർ ഡിസംബർ 31 ന് നിങ്ങളുടെ ജന്മദിനം ആഘോഷിക്കും എന്നാണ്. എന്നാൽ നിങ്ങൾ സംഭരിക്കാൻ തീരുമാനിക്കുകയാണെങ്കിൽ സമയം DATETIME കോളത്തിലെ ഇവൻ്റുകൾ, തുടർന്ന് DBMS ലെവലിൽ ഉപയോക്തൃ സമയ മേഖലകളുമായി പ്രവർത്തിക്കാൻ കഴിയില്ല. ഒരു ഉദാഹരണത്തിലൂടെ ഞാൻ വിശദീകരിക്കാം:

യൂസർ X UTC/GMT+2 സോണിലും Y - UTC/GMT+3 സോണിലും പ്രവർത്തിക്കുന്നു. MySQL-ലേക്കുള്ള ഉപയോക്തൃ കണക്ഷനുകൾക്കായി, ഒരു അനുബന്ധ (ഓരോന്നിനും അതിൻ്റേതായ) സമയ മേഖല സജ്ജീകരിച്ചിരിക്കുന്നു. ഉപയോക്താവ് ഫോറത്തിൽ ഒരു സന്ദേശം പോസ്റ്റുചെയ്യുന്നു, സന്ദേശം എഴുതിയ തീയതിയിൽ ഞങ്ങൾക്ക് താൽപ്പര്യമുണ്ട്.

ഓപ്ഷൻ 1: DATETIME. ഉപയോക്താവ് X 14:00 UTC/GMT+2-ൽ ഒരു സന്ദേശം എഴുതുന്നു. NOW() ഫംഗ്‌ഷൻ - 14:00 എക്‌സിക്യൂട്ട് ചെയ്യുന്നതിൻ്റെ ഫലമായി സന്ദേശത്തിൻ്റെ “തീയതി” ഫീൽഡിലെ മൂല്യം മാറ്റിസ്ഥാപിക്കുന്നു. ഉപയോക്താവ് Y സന്ദേശം എഴുതിയ സമയം വായിക്കുകയും അതേ 14:00 കാണുകയും ചെയ്യുന്നു. എന്നാൽ അവൻ്റെ ക്രമീകരണങ്ങൾ UTC/GMT+3 ആയി സജ്ജീകരിച്ചിരിക്കുന്നു, സന്ദേശം ഇപ്പോൾ എഴുതിയതല്ല, ഒരു മണിക്കൂർ മുമ്പാണെന്ന് അദ്ദേഹം കരുതുന്നു.

ഓപ്ഷൻ 2: TIMESTAMP. ഉപയോക്താവ് X 14:00 UTC/GMT+2-ൽ ഒരു സന്ദേശം എഴുതുന്നു. “തീയതി” ഫീൽഡിൽ NOW() ഫംഗ്‌ഷൻ - ഇൻ എക്‌സിക്യൂട്ട് ചെയ്യുന്നതിൻ്റെ ഫലം അടങ്ങിയിരിക്കുന്നു ഈ സാഹചര്യത്തിൽ- 12:00 UTC/GMT+0. ഉപയോക്താവ് സന്ദേശം എഴുതിയ സമയം വായിക്കുകയും സ്വീകരിക്കുകയും ചെയ്യുന്നു (UTC/GMT+3)(12:00 UTC/GMT+0) = 15:00 UTC/GMT+3. എല്ലാം നമ്മൾ ആഗ്രഹിക്കുന്ന രീതിയിൽ കൃത്യമായി മാറുന്നു. ഏറ്റവും പ്രധാനമായി, ഇത് ഉപയോഗിക്കുന്നത് വളരെ സൗകര്യപ്രദമാണ്: ഇഷ്‌ടാനുസൃത സമയ മേഖലകളെ പിന്തുണയ്ക്കുന്നതിന്, നിങ്ങൾ സമയ പരിവർത്തന കോഡൊന്നും എഴുതേണ്ടതില്ല.

നിലവിലെ സമയം മാറ്റിസ്ഥാപിക്കുന്നതിനും TIMESTAMP തരത്തിൽ സമയ മേഖലകളുമായി പ്രവർത്തിക്കുന്നതിനുമുള്ള സാധ്യതകൾ വളരെ ശക്തമാണ്, നിങ്ങൾക്ക് ഒരു നിശ്ചിത ലോഗിൽ സമയമില്ലാതെ ഒരു തീയതി സംഭരിക്കണമെങ്കിൽ, വ്യത്യാസത്തിൻ്റെ 1 ബൈറ്റ് ലാഭിക്കാതെ DATE-ന് പകരം TIMESTAMP ഉപയോഗിക്കണം. അവര്ക്കിടയില്. ഈ സാഹചര്യത്തിൽ, "00:00:00" അവഗണിക്കുക.

TIMESTAMP മൂല്യങ്ങളുടെ താരതമ്യേന ചെറിയ ശ്രേണി കാരണം നിങ്ങൾക്ക് ഉപയോഗിക്കാൻ കഴിയുന്നില്ലെങ്കിൽ (സാധാരണയായി 1-2 കേസുകൾ, സൈറ്റ് ഡാറ്റാബേസിൽ 10-15 എന്നിവയ്‌ക്കെതിരെ), നിങ്ങൾ DATETIME ഉപയോഗിക്കുകയും ശരിയായ സ്ഥലങ്ങളിൽ അതിൻ്റെ മൂല്യങ്ങൾ ശ്രദ്ധാപൂർവ്വം ക്രമീകരിക്കുകയും വേണം ( അതായത്, ഈ ഫീൽഡിൽ എഴുതുമ്പോൾ, തീയതി UTC യിലേക്കും വായിക്കുമ്പോൾ - വായന ഉപയോക്താവിൻ്റെ സോണിലെ സമയത്തിലേക്കും മാറ്റുക). നിങ്ങൾ തീയതി മാത്രമാണ് സംഭരിക്കുന്നതെങ്കിൽ, നിങ്ങൾക്ക് ഏത് സമയ മേഖല ഉണ്ടെന്നത് പ്രശ്നമല്ല: പുതുവർഷംഎല്ലാവരും പ്രാദേശിക സമയം അനുസരിച്ച് ജനുവരി 1 ആഘോഷിക്കുന്നു, ഇവിടെ ഒന്നും വിവർത്തനം ചെയ്യേണ്ട ആവശ്യമില്ല.

ഈ ലേഖനത്തിൻ്റെ ഉദ്ദേശ്യം DATETIME തരത്തിൽ പ്രവർത്തിക്കുന്നതിൻ്റെ പ്രത്യേകതകൾ വിശദീകരിക്കുക എന്നതാണ് SQL സെർവർ, പൊതുവായ തെറ്റിദ്ധാരണകൾ ഉൾപ്പെടെ പൊതുവായ ശുപാർശകൾഅവരെ മറികടക്കാൻ. ഫ്രാങ്ക് കാലിസിന് നന്ദി, ഈ ലേഖനം ജർമ്മൻ ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്തിട്ടുണ്ട്.

നന്ദി:

ഈ ലേഖനത്തിലേക്കുള്ള വിലയേറിയ നിർദ്ദേശങ്ങൾക്കും സംഭാവനകൾക്കും ഇനിപ്പറയുന്ന ആളുകൾക്ക് നന്ദി പറയാൻ ഞാൻ ആഗ്രഹിക്കുന്നു: സ്റ്റീവ് കാസ്, ആരോൺ ബെർട്രാൻഡ്, ജാക്കോ ഷാക്ക്വിക്ക്, ക്ലോസ് ഒബർഡാൽഹോഫ്, ഹ്യൂഗോ കോർനെലിസ്, ഡാൻ ഗുസ്മാൻ, എർലാൻഡ് സോമർസ്കോഗ്.

SQL സെർവർ പതിപ്പുകൾ

ഈ ലേഖനം SQL സെർവർ 7.0, 2000, 2005, 2008 എന്നിവയ്‌ക്ക് ബാധകമാണ്.

SQL സെർവറിലെ തീയതിയും സമയ തരങ്ങളും

SQL സെർവർ 2008-ന് മുമ്പ്, തീയതിയും സമയവും കൈകാര്യം ചെയ്യുന്നതിനായി SQL സെർവറിന് രണ്ട് ഡാറ്റ തരങ്ങളുണ്ടായിരുന്നു. ഈ ലേഖനത്തിൽ ഞങ്ങൾ പലപ്പോഴും ഈ തരങ്ങളെ പരാമർശിക്കുന്നതിനാൽ, ചുവടെയുള്ള രണ്ട് പട്ടികകളിൽ (SC കോളം) ഓരോ തരത്തിനും ഞങ്ങൾ ഒരു ചുരുക്കെഴുത്ത് അവതരിപ്പിക്കും:

പേര്

മിനി. അർത്ഥം

പരമാവധി. അർത്ഥം

കൃത്യത

മെമ്മറി ഉപയോഗിച്ചു

ചെറിയ തീയതി സമയം എസ്ഡിടി 1900-01-01 00:00:00 2079-06-06 23:59:00 മിനിറ്റ് 4 ബൈറ്റുകൾ
തീയതി സമയം dt 1753-01-01 00:00:00.000 9999-12-31 23:59:59.997 3.33 എം.എസ് 8 ബൈറ്റുകൾ

ഒരു തീയതിയോ സമയമോ മാത്രം ഉൾക്കൊള്ളുന്ന ഒരു ഡാറ്റാ തരവും ഇവിടെ ഇല്ലെന്നത് ശ്രദ്ധിക്കുക. മുകളിലുള്ള രണ്ട് ഡാറ്റ തരങ്ങളും തീയതിയും സമയവും പോലുള്ള ഭാഗങ്ങൾ/സെഗ്‌മെൻ്റുകൾ ഉൾക്കൊള്ളുന്നു.

നിങ്ങൾ തീയതി ഭാഗം മാത്രം വ്യക്തമാക്കുകയാണെങ്കിൽ, SQL സെർവർ സമയം 00:00:00.000 ആയി സംഭരിക്കും.
നിങ്ങൾ മൂല്യം സമയമായി മാത്രം സജ്ജമാക്കുകയാണെങ്കിൽ, SQL സെർവർ തീയതി 01/01/1900 ആയി സംഭരിക്കും.
ഇത് വളരെ പ്രധാനപെട്ടതാണ്. ഒന്നുകൂടി വായിക്കൂ.

തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘20041223’ എഎസ് തീയതി സമയം )

———————–
2004-12-23 00:00:00.000

തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (’14:23:58′ എഎസ് തീയതി സമയം )

———————–
1900-01-01 14:23:58.000

SQL സെർവർ 2008 ൻ്റെ വരവോടെ, തീയതിയും സമയ മൂല്യങ്ങളുമായി ബന്ധപ്പെട്ട നിരവധി പുതിയ ഡാറ്റാ തരങ്ങൾ അവതരിപ്പിച്ചു:

പേര്

മിനി. അർത്ഥം

പരമാവധി. അർത്ഥം

കൃത്യത

മെമ്മറി ഉപയോഗിച്ചു

തീയതിസമയം2 dt2 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 ns 6-8 ബൈറ്റുകൾ
തീയതി ഡി 0001-01-01 9999-12-31 ദിവസം 3 ബൈറ്റുകൾ
സമയം ടി 00:00:00.0000000 23:59:59.9999999 100 ns 3-5 ബൈറ്റുകൾ
തീയതി സമയം ഓഫ്സെറ്റ് dto 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 ns 8-10 ബൈറ്റുകൾ
  • നിങ്ങൾക്ക് കാണാനാകുന്നതുപോലെ, ഞങ്ങൾക്ക് ഒടുവിൽ തീയതി-മാത്രം ഡാറ്റ തരങ്ങൾ ലഭിച്ചു ( തീയതി) സമയത്തേക്ക് മാത്രം ( സമയം).
  • തീയതിസമയം2പല കാരണങ്ങളാൽ ഇതൊരു "മികച്ച DATETIME" ആണ്, മാത്രമല്ല കൂടുതൽ മെമ്മറി എടുക്കുന്നില്ല തീയതി സമയംഅതിലും കുറവായിരിക്കാം!
  • സമയ മൂല്യം ഉൾപ്പെടുന്ന ഒരു പുതിയ തരത്തിന്, ദശാംശ ബിന്ദുവിന് ശേഷം സെക്കൻഡിൽ ഉപയോഗിക്കുന്ന അക്കങ്ങളുടെ ക്രമം വ്യക്തമാക്കുന്നതിലൂടെ നിങ്ങൾക്ക് "ഫ്രാക്ഷണൽ സെക്കൻഡ് പ്രിസിഷൻ" വ്യക്തമാക്കാൻ കഴിയും. അതിനാൽ സമയം(3) ന് 14:23:12.567 പോലെയുള്ള മൂല്യങ്ങൾ സംഭരിക്കാൻ കഴിയും, അത് 14:23:12:5677 എന്ന് നൽകുമ്പോൾ 14:23:12:568 ആയി റൗണ്ട് ചെയ്യപ്പെടും.
  • പുതിയ തരം തീയതി സമയം ഓഫ്സെറ്റ്പ്രാദേശിക സമയ മേഖല ഓഫ്‌സെറ്റിൻ്റെ ഒരു ഭാഗം അടങ്ങിയിരിക്കുന്നു.

തീയതിയും സമയ ഫോർമാറ്റുകളും

SQL സെർവർ ഇത്തരത്തിലുള്ള ഡാറ്റ ചില പ്രത്യേക റീഡബിൾ ഫോർമാറ്റിൽ സംഭരിക്കുന്നു എന്നതാണ് ഒരു പൊതു തെറ്റിദ്ധാരണ. ഇത് തെറ്റാണ്. SQL സെർവർ അത്തരം മൂല്യങ്ങൾ അതിൻ്റെ ആന്തരിക ഫോർമാറ്റിൽ സംഭരിക്കുന്നു (ഉദാഹരണത്തിന്, ഇതിനായി രണ്ട് പൂർണ്ണസംഖ്യകൾ തീയതി സമയംഒപ്പം ചെറിയ തീയതി സമയം). ഒരു മൂല്യം സജ്ജീകരിക്കാൻ T-SQL ഉപയോഗിക്കുമ്പോൾ (ഉദാഹരണത്തിന് ഒരു INSERT പ്രസ്താവനയിൽ) നിങ്ങൾ അത് ഇങ്ങനെ പ്രകടിപ്പിക്കുന്നു ടെക്സ്റ്റ് സ്ട്രിംഗ്. SQL സെർവർ വ്യാഖ്യാനിക്കുന്നതിനുള്ള നിയമങ്ങളും ഉണ്ട് വിവിധ ഫോർമാറ്റുകൾതീയതി-ചരടുകൾ. എന്നാൽ ഒരു സാഹചര്യത്തിലും SQL സെർവർ ഈ ഫോർമാറ്റ് ഓർമ്മിക്കില്ല എന്നത് ശ്രദ്ധിക്കുക.

തീയതിക്കും സമയത്തിനുമുള്ള ഇൻപുട്ട് ഫോർമാറ്റുകൾ

നിരവധിയുണ്ട് ലഭ്യമായ ഫോർമാറ്റുകൾമൂല്യങ്ങൾ തീയതി/സമയം/തീയതി സമയത്തിലേക്ക് പരിവർത്തനം ചെയ്യാൻ. അവയിൽ ചിലത് മറ്റുള്ളവരെക്കാൾ "മികച്ചവയാണ്", "മികച്ചത്" എന്തുകൊണ്ടെന്ന് പിന്നീട് നിങ്ങൾക്ക് മനസ്സിലാകും. ഈ ഫോർമാറ്റുകളെല്ലാം എല്ലാ തരത്തിനും ബാധകമാണെന്നത് ശ്രദ്ധേയമാണ്. അതിനാൽ "സമയം മാത്രം" എന്ന ഫോർമാറ്റ് പോലും "തീയതി മാത്രം" തരത്തിനും മറ്റും ബാധകമാണ്. (ഡാറ്റ തരത്തിൽ മാത്രം ഉപയോഗിക്കുന്ന പ്രാദേശിക സമയ മേഖല ഓഫ്‌സെറ്റ് ഭാഗത്തെ ഈ ലേഖനം അവഗണിക്കുന്നു തീയതി സമയം ഓഫ്സെറ്റ്– ബുക്സ് ഓൺലൈനിൽ ഏതിനെ കുറിച്ച് കൂടുതൽ.)

പേര്

ഫോർമാറ്റ്

DATEFORMAT ഡിപൻഡൻസി സജ്ജമാക്കുക

ഭാഷാ ആശ്രിതത്വം സജ്ജമാക്കുക

ഭാഷാ നിഷ്പക്ഷത

വേർപെടുത്താത്തത് യു ‘19980223 14:23:05’ ഇല്ല ഇല്ല എല്ലാവർക്കും
വേർപിരിഞ്ഞു എസ് '02/23/1998 14:23:05' എല്ലാവർക്കും എല്ലാവർക്കും ഇല്ല
ANSI SQL ansisql ‘1998-12-23 14:23:05’ എസ്ഡിടി , dt എസ്ഡിടി , dt വേണ്ടിയല്ല എസ്ഡിടി ഒപ്പം dt
അക്ഷരമാലാക്രമം ’23 ഫെബ്രുവരി 1998 14:23:05′ ഇല്ല എല്ലാവർക്കും (മാസത്തിൻ്റെ പേര്) ഇല്ല
ODBC തീയതി സമയം ഒട്ടി (ts ‘1998-02-23 14:23:05’) ഇല്ല ഇല്ല എല്ലാവർക്കും
ODBC തീയതി od (d '1998-02-23') ഇല്ല ഇല്ല എല്ലാവർക്കും
ODBC സമയം ഒട്ടി (t '14:23:05′) ഇല്ല ഇല്ല എല്ലാവർക്കും
ISO 8601 iso ‘1998-02-23T14:23:05’ ഇല്ല ഇല്ല എല്ലാവർക്കും
സമയം ടി '14:23:05'
‘2:23:05 PM’
ഇല്ല ഇല്ല എല്ലാവർക്കും
  • അതല്ല ANSI SQLശരിക്കും മാത്രം പ്രത്യേക കേസ്വേർതിരിച്ച ഫോർമാറ്റ് വേർപിരിഞ്ഞു("ഡിജിറ്റൽ" എന്ന് വിളിക്കപ്പെടുന്നവ), ഡാഷ് (-), സ്ലാഷ് (/), പിരീഡ് (.) എന്നിവ ഡിലിമിറ്ററുകളായി ഉപയോഗിക്കുന്നു. പക്ഷേ, ANSI SQL സ്റ്റാൻഡേർഡിൽ നിർവചിച്ചിരിക്കുന്ന ഒരേയൊരു ഫോർമാറ്റ് ഇതാണ് എന്നതിനാൽ, രചയിതാവിൻ്റെ അഭിപ്രായത്തിൽ ഇത് ഒരു പ്രത്യേക കേസായി പരാമർശിക്കേണ്ടതാണ്.
  • തീയതി കൂടാതെ/അല്ലെങ്കിൽ സമയ ഭാഗം നീക്കം ചെയ്യാൻ മിക്ക ഫോർമാറ്റുകളും നിങ്ങളെ അനുവദിക്കുന്നു, ചില സന്ദർഭങ്ങളിൽ ഇത് അൽപ്പം... വിചിത്രമായി തോന്നാം. ഉദാഹരണത്തിന്, '2008-08-25' എന്നത് ഒരു സമയ തരം ( സമയം), എന്നാൽ അന്തിമഫലം സ്ട്രിംഗിൽ മൂല്യങ്ങൾ സജ്ജീകരിക്കാത്തതിന് തുല്യമാണ് തീയതി സമയം. താഴെ പരിഗണിക്കുക:
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (എ.എസ് സമയം )
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘2008-08-25’ എഎസ് സമയം )

    രണ്ട് ചോദ്യങ്ങളും ഒരേ ഫലം നൽകുന്നു (സമയം 00:00:00).
  • ODBC ഫോർമാറ്റുകൾ ( ODBC തീയതി സമയം, ODBC തീയതി, ODBC സമയം) വ്യത്യസ്തമാണ്, അവയ്ക്ക് ഒരു ടോക്കൺ (ലിറ്ററൽ_ടൈപ്പ്, ടി, ഡി, അല്ലെങ്കിൽ ടിഎസ്) ഉള്ളതിനാൽ അത് നിങ്ങൾക്ക് ഒരു തീയതിയും സമയവും ലഭിക്കുന്നുണ്ടോ, ഒരു തീയതിയോ അല്ലെങ്കിൽ ഒരു സമയമോ എന്നതിനെ ആശ്രയിച്ച് ശരിയായി സജ്ജീകരിച്ചിരിക്കണം.
  • ഫോർമാറ്റ് പ്രയോഗിക്കാൻ ISO 8601ഒരു തീയതിയും സമയവും ആവശ്യമാണ്.
  • SET DATEFORMAT അതിൻ്റെ ക്രമീകരണങ്ങൾ SET ഭാഷയിൽ നിന്ന് അവകാശമാക്കുന്നു (എന്നാൽ വ്യക്തമായ ഒരു SET DATEFORMAT പിന്നീടുള്ള സെറ്റ് ഭാഷയെ അസാധുവാക്കുന്നു). ലോഗിൻ ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്ന ഓരോ ഭാഷയ്ക്കും ഡിഫോൾട്ട് ഭാഷാ ക്രമീകരണങ്ങൾ സജ്ജീകരിച്ചിരിക്കുന്നു. sp_configure ഉപയോഗിച്ചാണ് ഡിഫോൾട്ട് ലോഗിൻ ഭാഷ സജ്ജീകരിച്ചിരിക്കുന്നത്.
  • തീയതി ഭാഗം ഫോർമാറ്റിംഗും പുതിയ തരങ്ങളും സംബന്ധിച്ച നിയമങ്ങൾ ആശയക്കുഴപ്പമുണ്ടാക്കാം. പുതിയ പ്രസക്തമായ ഡാറ്റാ തരങ്ങൾ കാലികമാക്കാൻ Microsoft പ്രതിജ്ഞാബദ്ധമാണ് ( തീയതി, തീയതി സമയം2, തീയതി സമയം ഓഫ്സെറ്റ്) ക്രമീകരണങ്ങളെ ആശ്രയിക്കുന്നത് കുറവായിരുന്നു കൂടാതെ ANSI SQL ആവശ്യകതകൾക്ക് കൂടുതൽ അനുസൃതവുമാണ്. തൽഫലമായി, വർഷം ആദ്യം വരുന്നിടത്തോളം തീയതി-സമയ ഘടകങ്ങൾ ഹൈലൈറ്റ് ചെയ്യുന്നതിനുള്ള പുതിയ ഭാഷാ-നിഷ്പക്ഷ തരങ്ങൾ. SQL സെർവർഈ ഭാഗം വർഷമാണെന്ന് നിർണ്ണയിക്കേണ്ടത് ആവശ്യമാണ്, അതിനാൽ വർഷം ഉണ്ടാക്കുന്ന 4 സ്ഥാനങ്ങൾ ആവശ്യമാണ് (yyyy, yy അല്ല). അങ്ങനെയാണെങ്കിൽ, സ്ട്രിംഗ് ആദ്യം വർഷമായും പിന്നീട് മാസമായും ഒടുവിൽ ദിവസമായും വ്യാഖ്യാനിക്കപ്പെടും - DATEFORMAT പരിഗണിക്കാതെ അല്ലെങ്കിൽ ഭാഷാ ക്രമീകരണങ്ങൾ. മാസം ആദ്യം വ്യക്തമാക്കിയിട്ടുണ്ടെങ്കിൽ, DATEFORMAT കൂടാതെ ഭാഷാ ക്രമീകരണങ്ങൾ"നിരീക്ഷിക്കപ്പെടും":
    സെറ്റ് ഭാഷ ബ്രിട്ടീഷ് -dmy ഉപയോഗിക്കുന്നു
    പോകൂ
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (’02-23-1998 14:23:05′ എ.എസ് തീയതി ) -പിശക്
    പോകൂ
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘2/23/1998 14:23:05’ എ.എസ് തീയതി ) -പിശക്
    പോകൂ
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘1998-02-23 14:23:05’ എ.എസ് തീയതി ) -ശരി
    പോകൂ
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘1998.02.23 14:23:05’ എ.എസ് തീയതി ) -ശരി
    പോകൂ
    തിരഞ്ഞെടുക്കുക കാസ്റ്റ് (‘1998/02/23 14:23:05’ എ.എസ് തീയതി) -ശരി
    പോകൂ
    ആദ്യം
    വർഷം ഒന്നാം സ്ഥാനത്തല്ലാത്തതിനാൽ രണ്ട് അന്വേഷണങ്ങൾ തെറ്റാണ് (1998-ൽ 23 മാസങ്ങൾ ഇല്ല). ആവശ്യകതകൾ നിറവേറ്റുകയും വർഷം ആദ്യം ലിസ്‌റ്റ് ചെയ്യുകയും ചെയ്‌തതിനാൽ അടുത്ത മൂന്ന് ചോദ്യങ്ങളിൽ പിശകുകളൊന്നുമില്ല (ഞങ്ങൾ പുതിയ തീയതി തരം ശൈലികളിൽ ഒന്ന് ഉപയോഗിക്കുന്നു). വളരെ സുതാര്യമാണ്, അല്ലേ? 🙂

ലഭ്യമായ ഫോർമാറ്റുകളുടെ വിവരണങ്ങൾ ബുക്സ് ഓൺലൈനിൽ ലഭ്യമാണ്, അതിനാൽ ഓരോ ഫോർമാറ്റിനും വിശദമായി പോകുന്നതിൽ അർത്ഥമില്ല.

റിച്ചാർഡ് ടി. സ്നോഡ്ഗ്രാസ് എഴുതിയ SQL-ൽ സമയാധിഷ്ഠിത ഡാറ്റാബേസ് ആപ്ലിക്കേഷനുകൾ വികസിപ്പിക്കുന്നു: ഒരു ഡാറ്റാ മോഡലിൽ സമയത്തെ അടിസ്ഥാനമാക്കിയുള്ള വിവരങ്ങൾ പ്രതിനിധീകരിക്കുന്നതിനെക്കുറിച്ചുള്ള ധാരാളം വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു. കൂടാതെ, തീർച്ചയായും, നിങ്ങളുടെ ഈ അധിക (ചരിത്രപരമായ) വിവരങ്ങൾ ഉപയോഗിക്കാൻ കഴിയും SQL അന്വേഷണങ്ങൾ. ഈ പുസ്‌തകം പ്രിൻ്റ് ചെയ്‌തിട്ടില്ല, എന്നാൽ റിച്ചാർഡിൻ്റെ ഔദ്യോഗിക വെബ്‌സൈറ്റിൽ (www.cs.arizona.edu/people/rts), നിങ്ങൾക്ക് ഇത് PDF ഫോർമാറ്റിൽ സൗജന്യമായി ഡൗൺലോഡ് ചെയ്യാം.

വിവർത്തനം: Vinchik Evgeniy

ഉപയോഗിക്കാൻ ഞാൻ ശുപാർശ ചെയ്യുന്നില്ല ഒന്നുമില്ല DATETIME ഫീൽഡ്, അല്ലെങ്കിൽ TIMESTAMP. നിങ്ങൾക്ക് പൊതുവായി ഒരു നിർദ്ദിഷ്‌ട ദിവസം (ജന്മദിനം പോലെ) പ്രതിനിധീകരിക്കണമെങ്കിൽ, DATE തരം ഉപയോഗിക്കുക, എന്നാൽ നിങ്ങൾ കൂടുതൽ വ്യക്തതയുള്ള ആളാണെങ്കിൽ, സമയത്തിൻ്റെ ഒരു യൂണിറ്റ് (ദിവസം, ആഴ്ച്ച, മാസം വർഷം). DATETIME അല്ലെങ്കിൽ TIMESTAMP ഉപയോഗിക്കുന്നതിന് പകരം, BIGINT ഉപയോഗിക്കുക, യുഗം മുതലുള്ള മില്ലിസെക്കൻഡുകളുടെ എണ്ണം സംഭരിക്കുക (System.currentTimeMillis() നിങ്ങൾ ജാവ ഉപയോഗിക്കുകയാണെങ്കിൽ). ഇതിന് നിരവധി ഗുണങ്ങളുണ്ട്:

  1. നിങ്ങൾ വെണ്ടർ ലോക്ക്-ഇൻ ഒഴിവാക്കുക. മിക്കവാറും എല്ലാ ഡാറ്റാബേസും താരതമ്യേന സമാനമായ രീതിയിൽ പൂർണ്ണസംഖ്യകളെ പിന്തുണയ്ക്കുന്നു. നിങ്ങൾ മറ്റൊരു ഡാറ്റാബേസിലേക്ക് മാറാൻ ആഗ്രഹിക്കുന്നുവെന്ന് പറയാം. MySQL DATETIME മൂല്യങ്ങൾ തമ്മിലുള്ള വ്യത്യാസത്തെക്കുറിച്ചും Oracle അവയെ എങ്ങനെ നിർണ്ണയിക്കുന്നു എന്നതിനെക്കുറിച്ചും നിങ്ങൾക്ക് വിഷമിക്കണോ? വ്യത്യസ്തമായ ഇടയിൽ പോലും MySQL പതിപ്പുകൾ, TIMESTAMPS ഉണ്ട് വ്യത്യസ്ത തലംകൃത്യത. അടുത്തിടെ, ടൈംസ്റ്റാമ്പുകളിൽ MySQL മില്ലിസെക്കൻഡ് പിന്തുണയ്‌ക്കുന്നു.
  2. സമയ മേഖല പ്രശ്‌നങ്ങളൊന്നുമില്ല. സമയ മേഖലകളിൽ എന്താണ് സംഭവിക്കുന്നത് എന്നതിനെക്കുറിച്ച് ഇവിടെ ചില ഉൾക്കാഴ്ചയുള്ള അഭിപ്രായങ്ങൾ ഉണ്ടായിട്ടുണ്ട് വത്യസ്ത ഇനങ്ങൾഡാറ്റ. എന്നാൽ ഇതാണോ പൊതു വിജ്ഞാനം, നിങ്ങളുടെ സഹപ്രവർത്തകർ ഇത് എല്ലായ്‌പ്പോഴും പഠിക്കുമോ? മറുവശത്ത്, java.util.Date-ൽ BigINT മിക്സ് ചെയ്യുന്നത് വളരെ ബുദ്ധിമുട്ടാണ്. BIGINT ഉപയോഗിക്കുന്നത് വഴിയിൽ വീഴുന്ന ധാരാളം സമയമേഖല പ്രശ്‌നങ്ങളിലേക്ക് നയിക്കുന്നു.
  3. ശ്രേണികളെക്കുറിച്ചോ കൃത്യതയെക്കുറിച്ചോ വിഷമിക്കേണ്ട. ഭാവിയിലെ തീയതി ശ്രേണികൾ (TIMESTAMP 2038 മാത്രം) അനുസരിച്ച് വെട്ടിച്ചുരുക്കപ്പെടുന്നതിനെക്കുറിച്ച് നിങ്ങൾ വിഷമിക്കേണ്ടതില്ല.
  4. മൂന്നാം കക്ഷി ഉപകരണങ്ങളുടെ സംയോജനം. ഡാറ്റാബേസുമായി സംവദിക്കാൻ മൂന്നാം കക്ഷി ടൂളുകൾക്ക് (EclipseLink പോലുള്ളവ) ഒരു പൂർണ്ണസംഖ്യ ഉപയോഗിക്കുന്നത് നിസ്സാരമാണ്. എല്ലാ മൂന്നാം കക്ഷി ഉപകരണത്തിനും MySQL-ന് ഉള്ളതുപോലെ "തീയതി സമയത്തെക്കുറിച്ച്" ഒരേ ധാരണ ഉണ്ടായിരിക്കില്ല. നിങ്ങൾ ഈ ഇഷ്‌ടാനുസൃത ഡാറ്റ തരങ്ങളാണ് ഉപയോഗിക്കുന്നതെങ്കിൽ, നിങ്ങൾ java.sql.TimeStamp അല്ലെങ്കിൽ java.util.Date ഒബ്‌ജക്റ്റ് ഉപയോഗിക്കണമോ എന്ന് ഹൈബർനേറ്റിൽ കണ്ടെത്താൻ ശ്രമിക്കണോ? ഉപയോഗം അടിസ്ഥാന തരങ്ങൾഡാറ്റ ഉപയോഗപ്പെടുത്തുന്നു മൂന്നാം കക്ഷി ഉപകരണങ്ങൾനിസ്സാരമായ.

ഈ പ്രശ്നം നിങ്ങൾ ഡാറ്റാബേസിൽ പണ മൂല്യം (അതായത് $1.99) എങ്ങനെ സംഭരിക്കണം എന്നതുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. നിങ്ങൾ ഡാറ്റാബേസിൽ ഡെസിമൽ അല്ലെങ്കിൽ മണി ടൈപ്പ് ഉപയോഗിക്കണോ, അതോ ഏറ്റവും മോശം, ഡബിൾ ഉപയോഗിക്കണോ? മുകളിൽ ലിസ്റ്റുചെയ്തിരിക്കുന്ന പല കാരണങ്ങളാൽ ഈ 3 ഓപ്ഷനുകളും ഭയങ്കരമാണ്. BIGINT ഉപയോഗിച്ച് പണത്തിൻ്റെ മൂല്യം സെൻ്റിൽ സംഭരിക്കുക, തുടർന്ന് നിങ്ങൾ മൂല്യം ഉപയോക്താവിന് പ്രദർശിപ്പിക്കുമ്പോൾ സെൻറ് ഡോളറിലേക്ക് മാറ്റുക എന്നതാണ് പരിഹാരം. ഒരു ഡാറ്റാബേസിൻ്റെ ജോലി ഡാറ്റ സംഭരിക്കുകയും ഡാറ്റ ശേഖരിക്കാതിരിക്കുകയും ചെയ്യുക എന്നതാണ്. ഡാറ്റാബേസുകളിൽ നിങ്ങൾ കാണുന്ന എല്ലാ ഫാൻസി ഡാറ്റാ തരങ്ങളും (പ്രത്യേകിച്ച് ഒറാക്കിൾ) കുറച്ച് ചേർക്കുകയും വെണ്ടർ ലോക്കിലേക്കുള്ള പാതയിലേക്ക് നിങ്ങളെ നയിക്കുകയും ചെയ്യുന്നു.

2018-12-04T00:00Z

DATETIME-ന് 8 ബൈറ്റുകളുള്ള 4 ബൈറ്റുകളാണ് TIMESTAMP.

എന്നാൽ സ്ക്രൊണിഡ് പറഞ്ഞതുപോലെ ഇതിന് 1970-ൻ്റെ താഴ്ന്ന പരിധിയുണ്ട്. ഭാവിയിൽ സംഭവിക്കാവുന്ന എന്തിനും ഇത് മികച്ചതാണ്;)

2018-12-11T00:00Z

പ്രധാന വ്യത്യാസം DATETIME സ്ഥിരമാണ്, അതേസമയം TIMESTAMP എന്നത് time_zone ക്രമീകരണത്തെ ആശ്രയിച്ചിരിക്കുന്നു.

അതിനാൽ നിങ്ങൾക്ക് സമയ മേഖലകളിൽ സമന്വയിപ്പിച്ച ക്ലസ്റ്ററുകൾ ഉള്ളപ്പോൾ - അല്ലെങ്കിൽ ഭാവിയിൽ ഉണ്ടാകുമ്പോൾ മാത്രമേ ഇത് പ്രാധാന്യമുള്ളൂ.

കൂടുതലായി ലളിതമായ വാക്കുകളിൽ: എനിക്ക് ഓസ്‌ട്രേലിയയിൽ ഒരു ഡാറ്റാബേസ് ഉണ്ടെങ്കിൽ, അമേരിക്കയിൽ ഡാറ്റാബേസ് സമന്വയിപ്പിക്കാൻ/പൊപ്പുലേറ്റ് ചെയ്യാൻ ഞാൻ ആ ഡാറ്റാബേസിൻ്റെ ഒരു ഡംപ് എടുക്കുകയാണെങ്കിൽ, TIMESTAMP അത് പ്രതിഫലിപ്പിക്കും. തൽസമയംപുതിയ സമയമേഖലയിലെ ഇവൻ്റുകൾ, DATETIME ഇപ്പോഴും സമയമേഖലയിലെ ഇവൻ്റിൻ്റെ സമയത്തെ പ്രതിഫലിപ്പിക്കുന്നു.

ഒരു മികച്ച ഉദാഹരണം TIMESTAMP ഉപയോഗിക്കേണ്ടിയിരുന്ന DATETIME എന്നത് Facebook ആണ്, അവിടെ അവരുടെ സെർവറുകൾക്ക് സമയ മേഖലകളിൽ എന്താണ് സംഭവിച്ചതെന്ന് ഉറപ്പിക്കാൻ കഴിയില്ല. ഒരിക്കൽ ഞാൻ ഒരു സംഭാഷണം നടത്തി, അവിടെ സന്ദേശം അയയ്‌ക്കുന്നതിന് മുമ്പ് ഞാൻ സന്ദേശങ്ങൾക്ക് മറുപടി നൽകിയിരുന്നുവെന്ന് സമയം എന്നോട് പറഞ്ഞു. (തീർച്ചയായും, സമയമേഖലയിലെ തെറ്റായ വിവർത്തനം മൂലവും ഇത് സംഭവിക്കാം സോഫ്റ്റ്വെയർസമയം അയച്ചതും സമന്വയിപ്പിച്ചിട്ടില്ലെങ്കിൽ സന്ദേശമയയ്‌ക്കുന്നതിന്).

2018-12-18T00:00Z

വരി മെറ്റാഡാറ്റ (സൃഷ്‌ടിച്ചതോ പരിഷ്കരിച്ചതോ ആയ തീയതി) അല്ലാതെ മറ്റെന്തിനും ഞാൻ എപ്പോഴും DATETIME ഫീൽഡുകൾ ഉപയോഗിക്കുന്നു.