כיצד לתקן שגיאה 'המרה נכשלה בעת המרת תאריך ו / או זמן ממחרוזת תווים'?



נסה את הכלי שלנו לביטול בעיות

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



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

איור 1: שגיאת המרת תאריך ו / או שעה ממחרוזת התווים



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



דוגמה 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

איור 2: תבנית תאריך שגויה וכתוצאה מכך שגיאה



פורמט נכון:

פורמט התאריך הבריטי והצרפתי הוא 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

איור 3: תבנית תאריך נכונה עם סגנון תאריך בריטי / צרפתי 'dd / mm / yyyy'

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

איור 4: תבנית תאריך נכונה עם סגנון תאריך בריטי / צרפתי 'dd / mm / yy'

דוגמה 2:

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

תאריך שגוי:

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

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

איור 5: שגיאה שהועלתה כ- 2019 אינה שנה מעוברת, ולכן אין לה 29 פברואר כתאריך

תקן אחד:

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

איור 6: תאריך נכון

פורמט תאריך 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]

איור 7: פורמט תאריך ISO 8601 תקן בינלאומי

המלצות:

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

קריאה של 2 דקות