วิธีเลือกวันที่แบบไม่มีเวลาใน SQL


257

เมื่อฉันเลือกวันใน SQL 2011-02-25 21:17:33.933มันจะกลับมาเป็น 2011-02-25แต่ผมจำเป็นต้องใช้เพียงส่วนหนึ่งวันนั่นคือ ฉันจะทำสิ่งนี้ได้อย่างไร


4
ฉันเดาว่าเขาต้องการสตริงและดังนั้นจึงไม่มีการทำซ้ำ
bernd_k


@TylerH มีวิธีใดที่จะได้รับ 2011-02-25 00: 00: 00.000 แทนเวลาปัจจุบันหรือไม่
Thrainder

คำตอบ:


148

ฉันเดาว่าเขาต้องการสตริง

select convert(varchar(10), '2011-02-25 21:17:33.933', 120)

120 นี่บอกแปลงฟังก์ชั่นที่เราผ่านวันที่ป้อนข้อมูลในรูปแบบดังต่อไปนี้yyyy-mm-dd hh:mi:ss :


120 สำหรับคืออะไร
Павле

@ Павлеอ้างอิงบทความนี้รูปแบบวันที่และเวลา
Fox VĩnhTâm

ฉันใช้การแปลงตัวเลือกนี้ (varchar (10), ApproVED_DATE, 120), ฉันได้รับคอลัมน์ข้อผิดพลาด ApproVED_DATE datetime, ฉันจะแปลงมันอย่างไร? ข้อผิดพลาดตัวระบุหลายส่วน "LAB_RESULTS.APPROVED_DATE" ไม่สามารถผูกได้
อับดุลลาห์

530

สำหรับ SQL Server 2008:

Convert(date, getdate())  

โปรดดูที่https://docs.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql


6
ฉันได้รับ "วันที่พิมพ์ไม่ใช่ประเภทของระบบที่กำหนด"
SeaDrive

10
DATEมีอะไรใหม่ในปี 2008
Tim Schmelter

33
ฉันไม่รู้ว่าทำไมนี่ถึงเป็นคำตอบที่ยกระดับขึ้นมา คำถามนี้สำหรับ SQL Server 2005 ไม่ใช่ 2008 2005 ไม่มีdateชนิดข้อมูลดังนั้นการแสดงผลโซลูชันนี้จึงไม่ถูกต้อง
Joshua Burns

84
มันเพิ่มขึ้นเพราะคนมาหาวิธีแก้ปัญหาของพวกเขาไม่ใช่ผู้เขียน ดังนั้นหาก 110 คนพบว่าสิ่งนี้ใช้งานได้สำหรับพวกเขาฉันคิดว่ามันยุติธรรมที่มี upvotes 110 ตัว
James

ฉันมีข้อผิดพลาดเดียวกันเมื่อฉันใช้ select convert (table.order_date, getdate ()); sql server เวอร์ชั่น 2017 ข้อผิดพลาด (วันที่พิมพ์ไม่ใช่ประเภทของระบบที่กำหนด) วันที่และเวลาประเภทคอลัมน์
Abdullah

57

เร็วที่สุดคือdatediffเช่น

select dateadd(d, datediff(d,0, [datecolumn]), 0), other..
from tbl

แต่ถ้าคุณต้องการใช้ค่าเพียงอย่างเดียวคุณสามารถข้าม Dateadd เช่น

select ...
WHERE somedate <= datediff(d, 0, getdate())

โดยที่นิพจน์datediff(d, 0, getdate())นั้นเพียงพอที่จะส่งคืนวันที่วันนี้โดยไม่มีเวลา


Oldie แต่ goodie ใช้เคล็ดลับนี้หลายสิบครั้งใน 2000/2005 DB ที่เก่ากว่า
KeithS

43

ใช้ CAST (GETDATE () เป็นวันที่) ที่ใช้งานได้ง่ายสำหรับฉัน


ฉันจะเพิ่มชื่อคอลัมน์ของฉันที่ไหน เลือก cast (getdate () เป็น date, order_date) หรือไม่
อับดุลลาห์

@AbdullahCAST(order_date AS DATE)
Andrew Morton



10

สำหรับเวอร์ชั่นเก่าปี 2008 :

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)


applauses สำหรับสิ่งนี้! โซลูชันอื่น ๆ พึ่งพาเฉพาะส่วนของ varchar (10) ซึ่งเพิ่งตัดทอนค่า
Gonza Oviedo

2

มันช้าไปหน่อย แต่ใช้ฟังก์ชั่น "curdate" ของ ODBC (angle brackes 'fn' เป็นลำดับหนีฟังก์ชัน ODBC)

SELECT {fn curdate()} 

เอาท์พุท: 2013-02-01


4
ฉันอยากรู้ว่าคุณคิดว่าคำตอบของคุณดีกว่าคำตอบที่ยอมรับได้อย่างไร หรือที่คุณอาจหมายถึงคำตอบอื่น ๆ ?
Mikael Eriksson

1
@Mikael Eriksson: อืมมเพราะฟังก์ชั่น ODBC เป็นฟังก์ชั่นที่ยอมรับได้และสามารถจัดทำดัชนีได้ซึ่งแตกต่างจากฟังก์ชั่น SQL-Server แบบไม่ระบุชื่อ แต่ไม่เป็นไรมันเป็นเพียงปัญหาที่ปรับขนาดเมื่อคุณย้ายจาก 3 รายการของคุณในการทดสอบเพื่อรายการ 1 * 10E6 ในการผลิตคุณจะไม่ได้รับปัญหาในระหว่างการพัฒนา;)
Stefan Steiger

8
ถ้าคุณเรียกใช้แบบสอบถามนี้SELECT {fn curdate()} FROM (SELECT 1) AS T(X)และมีลักษณะที่แผนการดำเนินการที่เกิดขึ้นจริง (รุ่น XML) CONVERT(varchar(10),getdate(),23)คุณจะเห็นคือสิ่งที่จะดำเนินการจริง ดังนั้นประเภทข้อมูลของ ODBC ฟังก์ชันนี้varchar(10)ซึ่งหมายความว่าถ้าคุณต้องการเปรียบเทียบผลกับdatetimeคุณจะได้รับการแปลงโดยปริยายจากvarchar(10)ไปในสตริงdatetime ว่าการแปลงนัยจะล้มเหลวด้วยyyyy-mm-dd set dateformat dmy
Mikael Eriksson

1
@Mikael Eriksson: ดูเหมือนว่าเป็นข้อผิดพลาดพวกเขาควรใช้ SELECT CONVERT (char (8), GETDATE (), 112) แทน
Stefan Steiger

"ฟังก์ชั่นที่ยอมรับได้และสามารถจัดทำดัชนีได้ซึ่งแตกต่างจากฟังก์ชั่น nondeterministic SQL-Server" - เอ่ออะไรนะ
Martin Smith


2

แปลงกลับเป็นวันที่และเวลาหลังจากแปลงเป็นวันที่เพื่อเก็บ datatime เดิมหากจำเป็น

select Convert(datetime, Convert(date, getdate())  )

2

ในกรณีที่คุณต้องการเวลาเป็นศูนย์เช่น2018-01-17 00:00:00.000:

SELECT CONVERT(DATETIME, CONVERT(DATE, GETDATE()), 121)


ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา
Pratik Ghag

1

ใช้ง่าย:

convert(date, Btch_Time)

ตัวอย่างด้านล่าง:

ตาราง:

Efft_d       Loan_I  Loan_Purp_Type_C   Orig_LTV    Curr_LTV    Schd_LTV    Un_drwn_Bal_a      Btch_Time            Strm_I  Btch_Ins_I
2014-05-31  200312500   HL03             NULL         1.0000    1.0000         1.0000      2014-06-17 11:10:57.330  1005    24851e0a-53983699-14b4-69109


Select * from helios.dbo.CBA_SRD_Loan where Loan_I in ('200312500') and convert(date, Btch_Time) = '2014-06-17'

1

มันสายเกินไป แต่การติดตามฉันก็ทำได้ดี

declare @vCurrentDate date=getutcdate()

select @vCurrentDate

เมื่อชนิดข้อมูลเป็นวันที่ชั่วโมงจะถูกตัดทอน


0

ใน PLSQL คุณสามารถใช้

to_char(SYSDATE,'dd/mm/yyyy')

พิจารณาถ่ายโอนสิ่งนี้ไปยังความคิดเห็น
xlembouras

คำถามนี้เกี่ยวกับ SQL Server ... ไม่ใช่ Oracle
Ben

0

ก่อนอื่นแปลงวันที่จะลอย (ซึ่งแสดงตัวเลข) จากนั้นROUNDตัวเลขเป็น 0 จุดทศนิยมแล้วแปลงเป็นวันที่และเวลา

convert(datetime,round(convert(float,orderdate,101),0) ,101)

0

หากคุณต้องการคืนประเภทวันที่เช่นเดียวกับการใช้วันที่

CONVERT(date, SYSDATETIME())

หรือ

SELECT CONVERT(date,SYSDATETIME()) 

หรือ

DECLARE @DateOnly Datetime
SET @DateOnly=CONVERT(date,SYSDATETIME())

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