כיצד לתקן & lsquo; המרה נכשלה בעת המרת תאריך ו / או זמן ממחרוזת תווים & rsquo; שְׁגִיאָה?

ישנם מקרים רבים בהם תאריכים ושעות אינם מופיעים בפורמט שאתה רוצה שיהיה, וגם פלט שאילתה אינו מתאים לצרכי הצופים. ישנן מספר תכונות מובנות של שרת SQL לעיצוב מחרוזת התאריך בהתאם לצורך שלך, אך המחרוזת תתפרש על ידי שרת SQL וכדי למנוע שגיאות המרה היא צריכה להיות בתבנית מתאימה. כאשר אנו מנסים להמיר תאריך או שעה ממחרוזת תווים מתעוררת לפעמים שגיאה. "ההמרה נכשלה בעת המרת תאריך ו / או שעה ממחרוזת תווים."

שגיאת המרה בשעה תאריך

השגיאה שהוזכרה לעיל מתרחשת בדרך כלל כאשר תאריך מילולי אינו תקין ולא ניתן להמיר אותו מהמחרוזת לתאריך זמן או תאריך. שגיאה זו נובעת ממספר סיבות, בהן נדון בפירוט יחד עם מערך הפתרונות.

דוגמה 1:

בריטניה סימון תאריך ושעה מציג את התאריך באמצעות הפורמט יום-חודש-שנה (10 בינואר 2015 או 10/1/2015) שאנו יכולים להשיג באמצעות פונקציית "המרה" של SQL Server המובנית בתכונה "עיצוב" עם סגנון עיצוב 103.

כאן בדוגמה שלהלן אנו יכולים לראות כי מחרוזת התאריך שסופקה היא בתבנית שגויה. ראשית, הוא מספק את החודש, אחר כך את הימים ואת השנה שעברה שהוא שגוי ולא ניתן לפרש אותו על ידי שרת SQL מה שגורם לשגיאה. הפורמט הנכון להמרת תאריכים בסגנון בריטניה באמצעות סגנון תאריך "103" הוא "dd / mm / yyyy".

פורמט שגוי:

הכריז על @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'בחר CONVERT (datetime2, @date_time_value, 103) כ- UK_Date_Time_Style

פורמט נכון:

פורמט התאריך הבריטי והצרפתי הוא 103 = "dd / mm / yyyy" או 3 = "dd / mm / yy". כאן 103 ו- 3 הם סגנונות תאריך.

הכריז על @date_time_value varchar (100) = '10 / 1/15 21:02:04 'בחר CONVERT (datetime2, @date_time_value, 103) כ- Date_Time_Style
הכריז על @date_time_value varchar (100) = '10 / 1/15 21:02:04 'בחר CONVERT (datetime2, @date_time_value, 3) כ- UK_Date_Time_Style

דוגמה 2:

לפעמים המרת מחרוזת לתאריך בשרת SQL גורמת לשגיאה, לא בגלל תבניות התאריך או השעה שבהם משתמשים, אלא בגלל שאתה מנסה לאחסן מידע שגוי שאינו מקובל על התוכנית.

תאריך שגוי:

הסיבה לשגיאה הבאה היא אך ורק שבשנת 2019 אין תאריך כזה "29 בפברואר" מכיוון שאינה שנה מעוברת.

הצהיר על @date_time_value varchar (100) = '2019-02-29 21:02:04' בחר צוות שחקנים (@date_time_value כ- datetime2) כתאריך_זמן_ערך

תקן אחד:

הכריז על @date_time_value varchar (100) = '2019-02-28 21:02:04' בחר צוות שחקנים (@date_time_value כ- datetime2) כתאריך_זמן_ערך

פורמט תאריך ISO 8601:

למרות שפורמטים רבים זמינים לצורך מניפולציה בערכי תאריך, כאשר עובדים למסה גלובלית / בינלאומית, זה יכול להיות נושא שמישות לבחור ייצוג זמן. לכן יש להימנע ממילולי תרבויות / תאריכים ספציפיים. אם ניקח בחשבון תאריך זה "03/08/2018", הוא יתפרש בדרכים שונות באזורים שונים בעולם.

  • בסגנון בריטניה זה מתפרש כ- "8 במרץ 2018"
  • בסגנון אירופאי הוא מתפרש כ" -3 באוגוסט 2018 "

למרבה המזל, קיימת אלטרנטיבה אחת בתבנית התאריכים הבינלאומית שפותחה על ידי ISO. הפורמט הסטנדרטי העולמי של ISO 8601 "YYYY-MM-DDThh: mm: ss" הוא אפשרות עצמאית יותר לשפה עבור מילולי מחרוזות והיא מטפלת בכל הנושאים הללו. בעוד ש- "yyyy" היא השנה, "mm" הוא חודש ו- "dd" הוא יום. אז התאריך "8 במרץ 2018" בפורמט ISO בינלאומי נכתב בתור "2018-03-08". לפיכך פורמט ISO הוא הבחירה הטובה ביותר לייצוג תאריכים.

הכריז על @date_time_value varchar (100) = '2019-03-28 21:02:04' בחר המרה (datetime2, @ date_time_value, 126) כ [yyyy-mm-ddThh: mi: ss.mmm]

המלצות:

אני מקווה שמאמר זה יסייע בהפגת הבלבול שראיתי לעתים קרובות בקהילה לגבי ערכי תאריך / שעה. עם זאת, מומלץ לעולם לא לאחסן תאריכים בסוג טקסט (varchar, char, nvarchar, nchar או טקסט) תמיד לאחסן את ערך התאריכים בעמודות סוג DATE, DATETIME ורצוי DATETIME2 (מספק דיוק רב יותר), ולהשאיר את עיצוב פרטי התאריך. לשכבת ממשק המשתמש במקום לאחזר ממסד הנתונים.