วิธีการแปลงวันที่และเวลาเป็นสตริงใน T-SQL


92

ฉันแปลกใจที่ไม่พบคำถามนี้ที่นี่แล้ว

ฉันมีวันเวลาที่หลากหลายและฉันต้องการแปลงเป็นสตริงเพื่อที่ฉันจะได้ต่อท้ายกับสตริงอื่น ฉันต้องการให้อยู่ในรูปแบบที่สามารถแปลงกลับเป็นวันที่เวลาได้อย่างง่ายดาย

ฉันจะทำเช่นนี้ได้อย่างไร?

(ฉันต้องการส่วนวันที่และส่วนเวลา)


@TonyHopkinson ฉันได้รับความนิยมมากมายเช่นกัน แต่ดูเหมือนว่าพวกเขาทั้งหมดจะเปลี่ยนไปทางอื่น หรือต้องการอะไรที่ซับซ้อนมากขึ้น
cja

3
พิมพ์Convertดับเบิลคลิกเพื่อไฮไลต์กด Shift + F1 ... แนวป้องกันแรกเสมอ
Eric J. Price

คำตอบ:


158

แบบสอบถามต่อไปนี้จะได้รับวันที่และเวลาปัจจุบันและแปลงเป็นสตริง ด้วยรูปแบบต่อไปนี้
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 

50
ฉันยังไม่สามารถเข้าใจความจริงที่ว่าคุณต้องส่งตัวเลขโดยพลการเพื่อให้ได้รูปแบบที่ถูกต้อง
cja

4
@cja ฉันแบ่งปันความประหลาดใจของคุณโดยสิ้นเชิง ฉันต้องการระบุสตริงเช่นyyddssเพื่อให้ได้รูปแบบที่แน่นอนที่ฉันต้องการ อาจมีเหตุผลทางเทคนิคหรือประวัติศาสตร์สำหรับเรื่องนี้ แต่ยัง - น่ารำคาญมาก
Konrad Viltersten

2
ขอบคุณสำหรับการแก้ไขอย่างรวดเร็ว แต่ในคำตอบของคุณคุณกำลังเข้ารหัสเดือนเป็นนาที yyyy-MM-dd hh: mm: ss ไม่ใช่ yyyy-mm-dd hh: mm: ss
Tom Martin

แม้ว่านี่จะเก่า แต่ฉันเพิ่งเจอกระทู้นี้ เมื่อใช้DateTimeOffSetอย่าลืมปรับvarcharความยาวตามที่คุณต้องการให้ผลลัพธ์เป็นเช่นนั้น สำหรับฉันฉันไม่ต้องการเขตเวลาดังนั้นฉันจึงต้องใช้SELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

คุณสามารถใช้convertคำสั่งใน Microsoft SQL Server เพื่อแปลงวันที่เป็นสตริง ตัวอย่างของไวยากรณ์ที่ใช้จะเป็น:

SELECT convert(varchar(20), getdate(), 120)

ข้างต้นจะคืนค่าวันที่และเวลาปัจจุบันในรูปแบบของYYYY-MM-DD HH:MM:SSนาฬิกา 24 ชั่วโมง

คุณสามารถเปลี่ยนตัวเลขในตอนท้ายของคำสั่งเป็นหนึ่งในจำนวนมากซึ่งจะเปลี่ยนรูปแบบสตริงที่ส่งคืน รายการรหัสเหล่านี้สามารถพบได้ใน MSDN ในส่วนการอ้างอิงCAST และ CONVERT


7

มี 3 วิธีที่แตกต่างกันขึ้นอยู่กับความต้องการของฉันและเวอร์ชันที่ฉันใช้

นี่คือวิธี ..

1) การใช้การแปลง

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) การใช้ Cast (SQL Server 2008 ขึ้นไป)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) การใช้ชนิดข้อมูลอักขระที่มีความยาวคงที่

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'

5

นอกเหนือจากฟังก์ชันCASTและCONVERTในคำตอบก่อนหน้านี้หากคุณใช้ SQL Server 2012 ขึ้นไปคุณจะใช้ฟังก์ชันFORMATเพื่อแปลงDATETIMEประเภทตามเป็นสตริง

ในการแปลงกลับให้ใช้สิ่งที่ตรงกันข้ามPARSEหรือTRYPARSEฟังก์ชัน

รูปแบบการจัดรูปแบบขึ้นอยู่กับ. NET (คล้ายกับตัวเลือกการจัดรูปแบบสตริงของวิธี ToString ()) และมีข้อได้เปรียบในการรับรู้วัฒนธรรม เช่น.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

ผล:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000

ฉันขาดอะไรไปหรือปัญหา OPs แก้ไขได้ด้วย FORMAT (<date var>, 'dd MMMM yyyy HH: mm: ss') หรือรูปแบบวันที่ที่คุณต้องการหรือไม่!
Grim

@Grim คุณก็ทำได้เช่นกัน จากเอกสารThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
g2server

ฉันคิดว่าคุณทำงานหนักเกินไปที่นี่จริงๆ SQL Server มีสตริงที่เทียบเท่ากับ DATETIME2 สิ่งที่คุณกำลังทำอยู่ที่นี่คือการใช้การแปลงโดยนัยแล้วจัดรูปแบบสตริงผลลัพธ์ไม่ใช่วันที่และเวลา
Jamie Marshall

@JamieMarshall ไม่มากก็น้อย. MSDN แนะนำ:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
g2server



1

ผู้คนจำนวนมากได้รับคำตอบนี้ แต่ฉันรู้สึกว่าทางออกที่ง่ายที่สุดถูกทิ้งไปแล้ว

SQL SERVER (ฉันเชื่อว่ามันเป็นปี 2012+) มีสตริงที่เทียบเท่ากับ DATETIME2 ดังที่แสดงไว้ที่นี่

ดูส่วน "รูปแบบลิเทอรัลสตริงที่รองรับสำหรับ datetime2"

ในการตอบคำถาม OP อย่างชัดเจน:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

เอาต์พุต:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

หมายเหตุ: ตัวแปรแรก ( myVar) ถือค่านี้'2019-01-23 12:24:00.0000000'เช่นกัน มันก็จะได้รับการจัดรูปแบบให้Jan 23 2019 12:24PMเนื่องจากการเริ่มต้นการตั้งค่ารูปแบบสำหรับ SQL Server PRINTที่ได้รับการเรียกร้องเมื่อคุณใช้ อย่าสะดุดตรงนี้สตริงจริงใน(myVer)='2019-01-23 12:24:00.0000000'


0

ลองด้านล่าง:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

1
ดี !! เราจำเป็นต้องเขียน LEFT ด้วยหรือไม่?
Gaurav123

ใช้ 10 ตัวอักษรแรกดังนั้นหากคุณต้องการหากคุณต้องการวันที่
ram4nd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.