วิธีรับวันที่ในรูปแบบ YYYY-MM-DD จากเขตข้อมูลวันที่และเวลา TSQL


259

ฉันจะดึงวันที่จาก SQL Server ในYYYY-MM-DDรูปแบบได้อย่างไร ฉันต้องการสิ่งนี้เพื่อทำงานกับ SQL Server 2000 ขึ้นไป มีวิธีง่าย ๆ ในการดำเนินการนี้ใน SQL Server หรือมันจะแปลงได้ง่ายขึ้นโดยทางโปรแกรมหลังจากที่ฉันดึงข้อมูลชุดผลลัพธ์หรือไม่

ฉันได้อ่านCAST และ CONVERTบน Microsoft Technet แล้ว แต่รูปแบบที่ฉันต้องการไม่ได้อยู่ในรายการและการเปลี่ยนรูปแบบวันที่ไม่ใช่ตัวเลือก


คำอธิบาย BOL สำหรับ 126 นั้นค่อนข้างสับสน (ไม่พบคำอธิบายสำหรับ "T")
nojetlag

"T" แยกวันที่ออกจากเวลา ดู ISO 8601 ใน Wikipedia
krubo

คำตอบ:


428
SELECT CONVERT(char(10), GetDate(),126)

จำกัด ขนาดของสับ varchar ของส่วนชั่วโมงที่คุณไม่ต้องการ


3
ไม่ แต่ลูกค้าบางรายมีปัญหาเกี่ยวกับความยาวคงที่
gbn

54
โพสต์นี้เกิดขึ้นใน Google สำหรับการแปลงเป็น YYYYMMDD - เพื่อให้เป็น: CONVERT (ถ่าน (10), GetDate (), 112)
NealWalters

1
สิ่งนี้ไม่ได้ผลสำหรับฉันคำแนะนำด้านบนที่มีรหัส 112 คือ ขอบคุณ @NealWalters
AlexVPerl

4
รายการของรหัสจำนวนเต็มสำหรับรูปแบบผลลัพธ์: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen

รหัส 126 เหมาะสำหรับวันที่เช่นวันเดือนปีเกิดในรูปแบบ YYYY-mm-dd: CONVERT (อักขระถ่าน (10), pat_dob, 126) ในรูปแบบ pat_dob
jjwdesign

118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

1
วิธีรับ 'm / d / yyyy' แทน 'mm / dd / yyyy'
user_az

นี่คือคำตอบที่เป็นประโยชน์ที่สุดโดยไกล
Daniel

109

เริ่มต้นด้วยSQL Server 2012 (คำถามเดิมสำหรับ 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')


นี่เป็นวิธีที่มีความยืดหยุ่นในการทำวันที่ / เวลาใน SQL เวอร์ชันล่าสุดโดยใช้รูปแบบมาตรฐาน Dotnet อย่าลืมใช้ประโยชน์เดือน MM ให้แตกต่างจากนาที รูปแบบวันที่ทั้งหมด
jim birch

FORMAT ทำงาน (ปกติ) ช้ากว่า CONVERT 43 เท่า ฉันขอแนะนำอย่างยิ่งให้คุณไม่เคย (และฉันไม่ได้ใช้คำนั้นบ่อยๆ) ใช้ FORMAT
Jeff Moden

35

แบบฟอร์มที่คุณอยู่หลังจากนั้นแสดงอยู่ในเอกสารออนไลน์ของหนังสือ

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

ตัวอย่างเช่นลองต่อไปนี้:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
หากคุณใช้ค่าเริ่มต้นในกรณีนี้คุณจะได้รับค่าเวลา - รูปแบบทั้งหมดสำหรับรูปแบบ 120 คือ 'yyyy-mm-dd hh: mi: ss' โดยการประกาศความยาวอย่างชัดเจนมันถูกปรับให้อยู่ในรูปแบบที่คุณระบุในบันทึกย่อต้นฉบับ - 'yyyy-mm-dd'
DaveE

26

convertฟังก์ชั่นที่มีรูปแบบตัวระบุ 120 ที่จะทำให้คุณ "รูปแบบ YYYY-MM-DD HH: mm: ss" ดังนั้นคุณก็ต้องกำหนดความยาวถึง 10 จะได้รับเพียงส่วนหนึ่งวันที่:

convert(varchar(10), theDate, 120)

อย่างไรก็ตามวันที่จัดรูปแบบโดยทั่วไปดีกว่าที่จะทำในเลเยอร์การนำเสนอมากกว่าในฐานข้อมูลหรือชั้นธุรกิจ หากคุณส่งคืนวันที่ที่จัดรูปแบบจากฐานข้อมูลแล้วรหัสลูกค้าจะต้องแยกวิเคราะห์เป็นวันที่อีกครั้งหากจำเป็นต้องทำการคำนวณใด ๆ

ตัวอย่างใน C #:

theDate.ToString("yyyy-MM-dd")

1
ทำไมต้องลงคะแนน? หากคุณไม่ได้อธิบายว่าคุณคิดว่าอะไรผิดมันไม่สามารถปรับปรุงคำตอบได้
Guffa

14

สำหรับ YYYYMMDD ลอง

select convert(varchar,getDate(),112)

ฉันได้ทดสอบกับ SQLServer2008 เท่านั้น


7

อีกทางหนึ่ง ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

1
สิ่งนี้จะสร้างวันที่ 1 หลักใน 8/3/2012 ถ้าคุณต้องการ 2 หลัก mm / dd คุณต้องทิ้งวันที่ไว้ RIGHT ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) ตัวอย่างเช่น
MindStalker

7

สำหรับผู้ที่ต้องการเวลาเช่นกัน (ฉันทำ) ตัวอย่างต่อไปนี้อาจช่วยได้

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513

6
replace(convert(varchar, getdate(), 111), '/','-')

จะทำเคล็ดลับได้โดยไม่ต้อง "ตัดสิ่งใดออก"


ฉันชอบรุ่นนี้เพื่อหลีกเลี่ยงข้อผิดพลาด "ปี 9999" ที่เกี่ยวข้องกับเวอร์ชันการแปลง (varchar (10) ... )
ฟรานซิส Huang Huang

6

ในกรณีที่มีคนต้องการที่จะทำวิธีอื่น ๆและพบสิ่งนี้

select convert(datetime, '12.09.2014', 104)

สิ่งนี้จะแปลงสตริงในรูปแบบวันที่ภาษาเยอรมันเป็นวัตถุ datetime

ทำไมจึงเป็น 104 ดูที่นี่: http://msdn.microsoft.com/en-us/library/ms187928.aspx


5

ในลิงค์การแปลงและแปลงของคุณให้ใช้สไตล์ 126 ดังนี้:

CONVERT (varchar(10), DTvalue, 126)

สิ่งนี้จะตัดทอนเวลา ความต้องการของคุณที่จะมีมันใน yyyy-mm-dd หมายความว่ามันจะต้องเป็นประเภทข้อมูลสตริงและวันที่และเวลา

ตรงไปตรงมาแม้ว่าฉันจะทำกับลูกค้าจนกว่าคุณจะมีเหตุผลที่ดีที่จะไม่


4

หากคุณต้องการที่จะใช้มันเป็นวันที่แทนที่จะเป็นvarcharอีกครั้งหลังจากนั้นอย่าลืมที่จะแปลงมันกลับมา:

select convert(datetime,CONVERT(char(10), GetDate(),126))

สิ่งนี้จะไม่แปลงเป็นรูปแบบเริ่มต้นของระบบหรือไม่
Ignas Vyšnia

3

ฉันไม่แน่ใจว่าทำไมวิธีที่ง่ายที่สุดถูกข้าม / ข้ามไปในคำตอบข้างต้น:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

ฉันชอบอันที่สองเพราะภาษาที่คุณพูดคุณจะเข้าใจว่ามันคือวันที่!

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


2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)


1
เหตุใดจึงต้องใช้ NVARCHAR (20) มีอักขระพิเศษในนั้นได้ไหม
กม.

ฉันชอบที่จะใช้ UNICODE Mos ของโครงการระหว่างประเทศของฉัน ;-)
Dmitri Kouminov

2

คุณอาจใช้ DATEนี้คือการใช้ประเภทข้อมูลใหม่ อาจไม่ทำงานในเวอร์ชันก่อนหน้าทั้งหมด แต่จะใช้งานได้ง่ายกว่ามากในเวอร์ชันใหม่กว่า

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)


1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))


1

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

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

ทดสอบบน SQL Server 2016


คุณควรทดสอบเพื่อประสิทธิภาพ รูปแบบโดยทั่วไปจะช้ากว่าการแปลงที่ซับซ้อนถึง 43 เท่า
Jeff Moden

0

การใช้คำสั่ง CASE สำหรับแต่ละฟังก์ชั่นการแปลง / การส่งจะใช้งานได้สำหรับฉัน:

โปรดแทนที่ tableXXXXY ด้วยชื่อตารางของคุณและ issueDate_dat ด้วยชื่อของฟิลด์ datetime ของคุณในตารางนั้น:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

หวังว่านี่จะเป็นประโยชน์ chagbert


0

วิธีนี้ใช้ได้ผลกับฉันง่ายและมีประสิทธิภาพ (กับ 126 ด้วย)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

0

หากรูปแบบวันที่แหล่งที่มาของคุณยุ่งเหยิงให้ลองทำตามบรรทัดของ:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a

0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;

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