วิธีแยกวิเคราะห์สตริงเป็นวันที่?


คำตอบ:




22

สมมติว่าฐานข้อมูลเป็น MS SQL Server 2012 หรือสูงกว่านี่คือวิธีแก้ปัญหาที่ใช้งานได้ คำสั่งพื้นฐานประกอบด้วยการลองวิเคราะห์ในบรรทัด:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

นี่คือสิ่งที่เรานำมาใช้ในเวอร์ชันที่ใช้งานจริง:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

คอลัมน์ ModifiedOn และ ModifiedBy มีไว้เพื่อวัตถุประสงค์ในการติดตามฐานข้อมูลภายในเท่านั้น

ดูการอ้างอิง Microsoft MSDN เหล่านี้:


โดยถือว่า OP ใช้ Sql Server 2012+
Mark Kram

8

แม้ว่าสิ่งที่แปลงจะใช้งานได้ แต่คุณไม่ควรใช้มัน คุณควรถามตัวเองว่าทำไมคุณถึงแยกวิเคราะห์ค่าสตริงใน SQL-Server หากนี่เป็นงานครั้งเดียวที่คุณแก้ไขข้อมูลบางอย่างด้วยตนเองคุณจะไม่ได้รับข้อมูลนั้นในอีกครั้งก็ใช้ได้ แต่หากแอปพลิเคชันใดใช้สิ่งนี้คุณควรเปลี่ยนแปลงบางอย่าง วิธีที่ดีที่สุดคือใช้ประเภทข้อมูล "วันที่" หากเป็นการป้อนข้อมูลของผู้ใช้สิ่งนี้จะยิ่งแย่ลงไปอีก จากนั้นคุณควรตรวจสอบไคลเอนต์ก่อน หากคุณต้องการส่งผ่านค่าสตริงที่ SQL-Server คาดหวังวันที่คุณสามารถใช้รูปแบบ ISO ('YYYYMMDD') ได้ตลอดเวลาและควรแปลงโดยอัตโนมัติ


5
แล้วสถานการณ์ที่คุณกำลังนำเข้าไฟล์ข้อมูลจากระบบภายนอกบางระบบและคอลัมน์อินพุตอยู่ในรูปแบบใดรูปแบบหนึ่งเหล่านี้เช่น "05/31/2013" แต่รูปแบบใดมาเป็นสตริง และคุณกำลังเขียนพูดว่าเป็นขั้นตอนการจัดเก็บเพื่อนำเข้าข้อมูลนั้นหรือใช้ SSIS เพื่อนำเข้า? แล้ว CONVERT จะเป็นสิ่งที่เหมาะสมที่จะใช้หรือไม่?
David Barrows

ไม่จำเป็นว่าในสถานการณ์ที่ MS SQL Server โฮสต์แบบจำลองข้อมูลการวิเคราะห์เมื่อเทียบกับการทำธุรกรรมการใช้ CONVERT นั้นเป็นเรื่องที่ถูกต้องอย่างยิ่งเพราะต้องจัดการกับแหล่งข้อมูลภายนอกจำนวนมากที่ไม่สามารถเข้ามาในรูปแบบวันที่ได้ (ตามที่ David Barrows กล่าวถึงข้างต้น)
Will

รูปแบบลิเทอรัลสตริงเริ่มต้นสำหรับวันที่คือYYYY-MM-DD
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

จะทำในสิ่งที่จำเป็นผลลัพธ์:

2012-04-24 00:00:00.000

ดูเหมือนว่าจะไม่ได้ผลกับสิ่งที่ OP โพสต์แม้จะตั้งค่าภาษาอื่นก็ตาม ลองมัน. หากใช้งานได้จริงโปรดโพสต์ว่าการตั้งค่าภาษาปัจจุบันของคุณคืออะไร ขอบคุณ. นี่คือรหัสสำหรับลอง ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.