Cách chọn ngày không có thời gian trong SQL


257

Khi tôi chọn ngày trong SQL, nó được trả về là 2011-02-25 21:17:33.933. Nhưng tôi chỉ cần phần Ngày, đó là 2011-02-25. Tôi có thể làm cái này như thế nào?


4
Tôi đoán anh ấy muốn một chuỗi, và do đó nó không bị trùng lặp
bernd_k


@TylerH có cách nào để nhận 2011 / 02-25 00: 00: 00.000 thay vì thời gian hiện tại không?
Thrainder

Câu trả lời:


148

Tôi đoán anh ấy muốn một chuỗi.

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

120 ở đây cho biết chức năng chuyển đổi mà chúng ta vượt qua ngày đầu vào theo định dạng sau : yyyy-mm-dd hh:mi:ss.


120 để làm gì?
Павле

@ Đại diện tham khảo bài viết này Phong cách ngày và giờ
Fox Vĩnh Tâm

Tôi đã sử dụng chuyển đổi chọn này (varchar (10), APPROVED_DATE, 120), tôi đã nhận được cột lỗi APPROVED_DATE datetime, tôi sẽ chuyển đổi nó như thế nào? lỗi Định danh nhiều phần "LAB_RESULTS.APPROVED_DATE" không thể bị ràng buộc.
Abdullah

530

Đối với SQL Server 2008:

Convert(date, getdate())  

Vui lòng tham khảo https://docs.microsoft.com/en-us/sql/t-sql/fifts/getdate-transact-sql


6
Tôi nhận được "Loại ngày không phải là loại hệ thống xác định."
SeaDrive

10
DATElà mới trong năm 2008
Tim Schmelter

33
tôi không biết tại sao đây là một câu trả lời nâng cao như vậy. câu hỏi này dành cho SQL Server 2005, NOT 2008 2005 không có kiểu datedữ liệu do đó khiến giải pháp này không hợp lệ.
Joshua Đốt cháy

84
Nó được khuyến khích bởi vì mọi người tìm kiếm giải pháp cho vấn đề của họ, không phải các tác giả. Vì vậy, nếu 110 người tìm thấy điều này làm việc cho họ, tôi nghĩ thật công bằng khi nó có 110 lượt upvote.
James

Tôi có lỗi tương tự khi tôi sử dụng select convert (table.order_date, getdate ()); phiên bản máy chủ sql 2017, lỗi (Ngày loại không phải là loại hệ thống xác định) datetime kiểu cột
Abdullah

57

Nhanh nhất là datediff, vd

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

Nhưng nếu bạn chỉ cần sử dụng giá trị, thì bạn có thể bỏ qua bảng dữ liệu, vd

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

trong đó biểu thức datediff(d, 0, getdate())là đủ để trả về ngày hôm nay mà không có phần thời gian.


Oldie nhưng goodie, đã sử dụng thủ thuật này hàng chục lần trong các DB 2000/2005 cũ.
KeithS

43

Sử dụng CAST (GETDATE () là ngày) làm việc cho tôi, đơn giản.


nơi tôi sẽ thêm tên cột của tôi? chọn cast (getdate () làm ngày, order_date)?
Abdullah

@AbdullahCAST(order_date AS DATE)
Andrew Morton


12

bạn có thể sử dụng như thế này

SELECT Convert(varchar(10), GETDATE(),120) 

nơi tôi sẽ đặt ngày đặt hàng tên cột của tôi?
Abdullah

10

Đối với phiên bản cũ hơn 2008 :

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


vỗ tay cho điều này! Các giải pháp khác chỉ dựa vào phần varchar (10), phần này chỉ cắt bớt giá trị.
Gonza Oviedo

2

Hơi muộn một chút, nhưng hãy sử dụng chức năng "curdate" của ODBC (góc lợ 'fn' là chuỗi thoát hàm ODBC).

SELECT {fn curdate()} 

Đầu ra: 2013-02-01


4
Tôi thực sự tò mò về cách bạn nghĩ câu trả lời của bạn tốt hơn câu trả lời được chấp nhận. Hoặc nơi mà bạn có thể đề cập đến các câu trả lời khác?
Mikael Eriksson

1
@Mikael Eriksson: Hmm, vì Hàm ODBC là các hàm chính tắc và do đó có thể lập chỉ mục, không giống như các hàm SQL-Server không đặc thù. Nhưng đừng bận tâm, đó chỉ là vấn đề mở rộng khi bạn chuyển từ 3 mục nhập thử nghiệm sang các mục 1 * 10E6 trong sản xuất, bạn không gặp vấn đề gì trong quá trình phát triển;)
Stefan Steiger

8
Nếu bạn chạy truy vấn này SELECT {fn curdate()} FROM (SELECT 1) AS T(X)và xem xét kế hoạch thực hiện thực tế (phiên bản xml), bạn sẽ thấy những gì thực sự được thực hiện là CONVERT(varchar(10),getdate(),23). Vì vậy, kiểu dữ liệu của hàm ODBC này varchar(10)có nghĩa là nếu bạn muốn so sánh kết quả với một kết quả, datetimebạn sẽ nhận được một chuyển đổi ngầm định từ varchar(10)sang datetimetrên một chuỗi yyyy-mm-dd. Chuyển đổi ngầm đó sẽ thất bại với set dateformat dmy.
Mikael Eriksson

1
@Mikael Eriksson: Trông giống như một lỗi, họ nên sử dụng CHỌN CHUYỂN ĐỔI (char (8), GETDATE (), 112) để thay thế.
Stefan Steiger

"Các hàm chính tắc và do đó có thể lập chỉ mục, không giống như các hàm SQL-Server không đặc thù" - er, cái gì?
Martin Smith

2

Bạn cũng có thể thử cái này

SELECT CONVERT(DATE, GETDATE(), 120)

2

Chuyển đổi nó trở lại datetime sau khi chuyển đổi thành ngày để giữ nguyên datatime nếu cần

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

2

Trong trường hợp nếu bạn cần thời gian để trở thành số không như 2018-01-17 00:00:00.000:

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


Cảm ơn, đây là những gì tôi đang tìm kiếm.
Pratik Ghag

1

Sử dụng rất đơn giản:

convert(date, Btch_Time)

Ví dụ dưới đây:

Bàn:

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

Quá muộn nhưng làm việc tốt cho tôi

declare @vCurrentDate date=getutcdate()

select @vCurrentDate

Khi kiểu dữ liệu là ngày, giờ sẽ bị cắt ngắn


0

Trong PLSQL bạn có thể sử dụng

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

xem xét chuyển điều này để bình luận.
xlembouras

Câu hỏi này là về Máy chủ SQL ... không phải Oracle
Ben

0

Đầu tiên Chuyển đổi ngày thành float (hiển thị số), sau đó ROUNDlà số thập phân thành 0 dấu thập phân, sau đó chuyển đổi đó thành datetime.

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

0

Nếu bạn muốn trả về một loại ngày chỉ là một ngày sử dụng

CONVERT(date, SYSDATETIME())

hoặc là

SELECT CONVERT(date,SYSDATETIME()) 

hoặc là

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

0

Thử cái này.

SELECT DATEADD(DD, 0, DATEDIFF(DD, 0, GETDATE()))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.