Cách chỉ trả về Ngày từ kiểu dữ liệu DateTime của SQL Server


1778
SELECT GETDATE()

Trả về: 2008-09-22 15:24:13.790

Tôi muốn phần ngày đó mà không có phần thời gian: 2008-09-22 00:00:00.000

Làm thế nào tôi có thể có được điều đó?


4
Nếu bạn đang tìm cách để có được một kiểu dữ liệu ngày mà không có thời gian, ngay cả khi thời gian là 00:00:00 thì bạn không gặp may, bạn có thể nhận được một varchar nhưng cấu trúc là một datetime và bạn sẽ luôn có thời gian.
Quintin Robinson

16
Một điều cần lưu ý là SQL Server 2008 bao gồm một kiểu dữ liệu DATE riêng để lưu trữ chỉ ngày mà không có thành phần thời gian. Thêm thông tin ở đây: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein

7
Đừng bỏ lỡ bài đăng này cho thấy kết quả kiểm tra hiệu suất của các phương pháp loại bỏ thời gian khác nhau.
ErikE

18
Đừng để bị đánh lừa bởi các phiếu bầu và câu trả lời được chấp nhận, Hãy xem stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews

8
@Rohit Bạn không chính xác khi cho rằng 2008 là phiên bản duy nhất mọi người quan tâm. (Có nhiều phiên bản hơn trong tự nhiên.) Các phiếu bầu cho chính họ.
hktegner

Câu trả lời:


2487

Trên SQL Server 2008và cao hơn, bạn nên CONVERThẹn hò:

SELECT CONVERT(date, getdate())

Trên các phiên bản cũ hơn, bạn có thể làm như sau:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

ví dụ

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

đưa cho tôi

2008-09-22 00:00:00.000

Ưu điểm:

  • Không có varchar<-> datetimechuyển đổi cần thiết
  • Không cần suy nghĩ về locale

Theo đề nghị của Michael

Sử dụng biến thể này: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Đầu ra:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

52
+1 Có vẻ như phương thức này nhanh hơn 35% so với phương thức convert () thường được sử dụng (mà tôi cũng đã sử dụng trong nhiều năm). Đẹp một.
Dane

8
Nhược điểm duy nhất tôi có thể thấy đối với giải pháp của bạn là trừ khi bạn biết những gì nó đang làm thì nó hơi khó hiểu. Sử dụng phương thức chuyển đổi kép làm cho ý định của bạn rõ ràng hơn đối với những người duy trì mã tương lai. BTW tôi đã không đánh giá thấp bạn. Tôi nghĩ rằng tôi cũng sẽ bắt đầu sử dụng phương pháp của bạn. Thankyou @aku
Jim Birchall

38
@pilavdzice Thiết lập thời gian đến nửa đêm của ngày hôm đó KHÔNG RÚT RA THỜI GIAN. Kết quả mà bạn mong đợi là gì? Kiểu datetimedữ liệu không thể có thời gian . Tôi nghĩ rằng bạn đang nhầm lẫn lưu trữ dữ liệu với trình bày người dùng. Nếu tất cả những gì bạn muốn là một cách để hiển thị cho người dùng một chuỗi không có phần thời gian (không phải là số không, chỉ là khoảng trống) thì bạn chỉ muốn Convert(varchar(30), @Date, 101)hoặc một cái gì đó tương tự. Xem Sách SQL Server trực tuyến • Truyền và chuyển đổi để biết thêm thông tin.
ErikE

7
@ user1671639 kiểu dữ liệu datetime luôn chứa cả ngày và giờ, bạn không thể lưu trữ một cách hợp lý mà không có cái kia - trừ khi bạn đang sử dụng SQL Server 2008, trong trường hợp đó cũng có dữ liệu 'ngày' và 'thời gian' riêng biệt các loại. Nếu bạn sử dụng CONVERT () như thế, bạn thực sự muốn một chuỗi để sử dụng sau này, vì vậy bạn sẽ bị mắc kẹt khi làm như vậy - mặc dù sẽ tốt hơn nếu bạn sử dụng các chức năng định dạng ngày thay vì cắt ngày - hoặc thông qua CAST(... AS DATE)hoặc CONVERT(DATE, ...), đã được đề cập khá thường xuyên trên chính trang này.
Magnus

10
Tôi khuyên bạn nên thay đổi câu trả lời SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)vì sau đó ddcó thể hoán đổi cho bất kỳ dateparttừ khóa nào khác để cắt ngắn của bạn datetimeở mức độ tùy ý.
Michael - Clay Shirky ở đâu

717

SQLServer 2008 hiện có kiểu dữ liệu 'ngày' chỉ chứa một ngày không có thành phần thời gian. Bất cứ ai sử dụng SQLServer 2008 trở lên đều có thể làm như sau:

SELECT CONVERT(date, GETDATE())

41
Ngoài ra còn có kiểu dữ liệu 'thời gian' trong SQL2008, câu trả lời cho nửa còn lại của câu hỏi phân tách ngày và giờ.
misteraidan

8
FYI, tôi đã điểm chuẩn các phương pháp khác nhau để cắt thời gian từ ngày và đây là phương pháp nhanh nhất. Cho rằng sự khác biệt là nhỏ, nhưng rõ ràng là nhanh hơn so với một số lượng lớn các vụ hành quyết.
UnhandledEx805Sean

2
wt về sqlserver 2005 ??
Tiến sĩ MAF

@ Dr.MAF Hoàn thành vòng tròn, câu trả lời trước năm 2008 có tại đây: stackoverflow.com/questions/113045/
Kẻ

170

Nếu sử dụng SQL 2008 trở lên:

select cast(getdate() as date)

3
@FredrickGauss: Loại gì, ngày nào? Phiên bản SQL Server nào bạn sử dụng?
abatishchev

7
Coi chừng! khai báo @ date1 datetime = '2015-09-30 20: 59: 59.999'; chọn diễn viên (@ date1 là ngày) trả về '2015-10-01'
Nick

6
@Nick: đây là vấn đề với DateTime. sử dụng DateTime2thay thế và nó hoạt động tốt. sqlfiddle.com/#!6/9eecb7/2833
abatishchev

8
@Nick, để bổ sung cho phản hồi abatishchev, @ date1 của bạn thực sự là 2015-10-01do DateTimehạn chế. Hãy thử mà không có bất kỳ diễn viên nào Date, nó cũng mang lại 2015-10-01! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric

4
Một trong những thủ thuật SQL dễ nhớ này. Như Mike nói, chỉ từ năm 2008 trở đi, nhưng nếu bạn tìm thấy một DB năm 2005 và trước đó ở đâu đó, bạn có thể có rất nhiều vấn đề :)
NicVerAZ

73

DATEADD và DATEDIFF tốt hơn CHUYỂN ĐỔI vào varchar. Cả hai truy vấn đều có cùng một kế hoạch thực hiện, nhưng các kế hoạch thực hiện chủ yếu là về dữ liệu các chiến lược truy cập và không phải lúc nào cũng tiết lộ chi phí ngầm liên quan đến thời gian CPU thực hiện để thực hiện tất cả các phần. Nếu cả hai truy vấn được chạy trên một bảng có hàng triệu hàng, thời gian CPU sử dụng DateDiff có thể gần bằng 1/3 thời gian Chuyển đổi CPU!

Để xem kế hoạch thực hiện cho các truy vấn:

set showplan_text on
GO 

Cả DATEADD và DATEDIFF sẽ thực thi CONVERT_IMPLICIT.

Mặc dù giải pháp CONVERT là đơn giản và dễ dàng hơn để đọc cho một số người, nó chậm hơn. Không cần phải quay lại datetime (điều này được hoàn thành bởi máy chủ). Sau đó, không có nhu cầu thực sự trong phương thức DateDiff cho DateAdd vì kết quả số nguyên cũng sẽ được chuyển đổi hoàn toàn thành datetime.


CHỌN CHUYỂN ĐỔI (varchar, MyDate, 101) TỪ DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

CHỌN DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) TỪ DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

Sử dụng FLOOR () như @digi đề xuất có hiệu suất gần hơn với DateDiff, nhưng không được khuyến nghị vì truyền kiểu dữ liệu datetime thành float và back không phải lúc nào cũng mang lại giá trị ban đầu.

Hãy nhớ mọi người: Đừng tin bất cứ ai. Nhìn vào số liệu thống kê hiệu suất, và tự kiểm tra nó!

Hãy cẩn thận khi bạn đang kiểm tra kết quả của bạn. Chọn nhiều hàng cho máy khách sẽ ẩn sự khác biệt về hiệu suất vì sẽ mất nhiều thời gian hơn để gửi các hàng qua mạng so với việc thực hiện các phép tính. Vì vậy, hãy chắc chắn rằng công việc cho tất cả các hàng được thực hiện bởi máy chủ nhưng không có hàng nào được gửi đến máy khách.

Dường như có sự nhầm lẫn đối với một số người về việc khi tối ưu hóa bộ đệm ảnh hưởng đến các truy vấn. Chạy hai truy vấn trong cùng một đợt hoặc trong các lô riêng biệt không ảnh hưởng đến bộ đệm. Vì vậy, bạn có thể hết hạn bộ đệm theo cách thủ công hoặc đơn giản là chạy các truy vấn qua lại nhiều lần. Bất kỳ tối ưu hóa nào cho truy vấn # 2 cũng sẽ ảnh hưởng đến mọi truy vấn tiếp theo, vì vậy hãy bỏ qua thực thi # 1 nếu bạn muốn.

Dưới đây là kịch bản thử nghiệm đầy đủ và kết quả hoạt động chứng minh DateDiff nhanh hơn đáng kể so với chuyển đổi sang varchar.


Ricardo C, điều tra tốt đẹp! Phiên bản máy chủ SQL nào bạn sử dụng? Trên phương pháp MSSQL2000 với dateiff thực hiện nhanh hơn một chút đối với tôi.
aku

Chỉ cần lưu ý, tôi đã thực hiện thử nghiệm 1000.000 lần. Đối với các kịch bản trong thế giới thực, sự khác biệt về hiệu suất sẽ không đáng chú ý, tôi đoán
aku

Aku, tôi đã sử dụng SQL Server 2005 Express cho bài kiểm tra này. Tôi làm việc vào năm 2000 tại nơi làm việc và tôi sẽ kiểm tra nó với một bảng có hơn 24 triệu hàng và xem những gì xuất phát từ nó.
Ricardo C

Aku, kết quả tương tự. Không có sự khác biệt về hiệu suất trên mười triệu hàng.
Ricardo C

5
Những tuyên bố về hiệu suất tương đương là không đúng sự thật. Tất nhiên các kế hoạch thực hiện sẽ giống nhau !!! Đo hiệu suất trên các PHẢI này được thực hiện bằng cách so sánh việc sử dụng CPU, không kiểm tra các kế hoạch thực hiện.
ErikE

51

Thử cái này:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Tuyên bố trên chuyển đổi định dạng hiện tại của bạn thành YYYY/MM/DD, vui lòng tham khảo liên kết này để chọn định dạng ưa thích của bạn.


5
Điều này trả về '2008/09/22' cho tôi
eddiegroves

1
CHỌN CHUYỂN ĐỔI (VARCHAR (10), GETDATE (), 101) là mm/dd/yyyyđịnh dạng.
Bọ chét

4
nếu bạn sắp xếp dựa trên giá trị văn bản thô (bên ngoài DB) thì định dạng 'nhật bản' sẽ tốt hơn
Simon_Weaver


21

Để trả lại ở định dạng ngày

CAST (Ngày đặt hàng AS)

Đoạn mã trên sẽ hoạt động trong máy chủ sql 2010

Nó sẽ trở lại như ngày 12/12/2013

Đối với SQL Server 2012, sử dụng mã dưới đây

CONVERT(VARCHAR(10), OrderDate , 111)

1
Điều này trả lại cho tôi ngày không có thời gian, không chỉ ngày
Bohemian

1
Tôi có thể biết phiên bản nào nếu máy chủ sql bạn đang sử dụng không?
Mahesh ML

1
@MaheshML, nó trả về cả ngày và thời gian trong MS SQL 2012.
Marek

1
Hoạt động như một bùa mê trong SQL Azure
Martín Coll

5
@MaheshML Không có thứ gì như SQL Server 2010
SvenAelterman


16

Nếu bạn cần kết quả như một varchar, bạn nên trải qua

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

đã được đề cập ở trên.

Nếu bạn cần kết quả ở định dạng ngày và giờ, bạn nên sử dụng bất kỳ truy vấn nào bên dưới

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

    2014 / 03-26 00: 00: 00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 

    2014 / 03-26 00: 00: 00.000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate

    2014 / 03-26 00: 00: 00.000


14
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

13

Sử dụng FLOOR () - chỉ cần cắt phần thời gian.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

4
Phương pháp này không phải là nhanh nhất, và cũng ngầm dạy mọi người rằng việc chọn ngày trôi nổi là chính xác, điều đó không phải. Xin vui lòng xem bài viết này để biết thêm chi tiết.
ErikE

13

Nếu bạn đang sử dụng SQL Server 2012 hoặc phiên bản cao hơn ,

Sử dụng Format()chức năng.

Đã có nhiều câu trả lời và định dạng cho máy chủ SQL. Nhưng hầu hết các phương thức hơi mơ hồ và bạn sẽ khó nhớ các số cho loại định dạng hoặc hàm đối với Định dạng Ngày cụ thể. Đó là lý do tại sao trong các phiên bản tiếp theo của máy chủ SQL có tùy chọn tốt hơn.

FORMAT ( value, format [, culture ] )

Tùy chọn văn hóa rất hữu ích, vì bạn có thể chỉ định ngày theo người xem của mình.

Bạn phải nhớ d (đối với mẫu nhỏ) và D (đối với mẫu dài).

1. "d" - Mẫu ngày ngắn.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "D" - Mẫu ngày dài.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

Thêm ví dụ trong truy vấn.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011101

Nếu bạn muốn nhiều định dạng hơn, bạn có thể truy cập:

  1. Chuỗi định dạng ngày và giờ chuẩn
  2. Chuỗi định dạng ngày và giờ tùy chỉnh

12

NẾU bạn muốn sử dụng CONVERT và nhận cùng một đầu ra như trong câu hỏi ban đầu được đặt ra, nghĩa là, yyyy-mm-dd sau đó sử dụng CONVERT(varchar(10),[SourceDate as dateTime],121)cùng một mã như các câu trả lời của cặp đôi trước đó, nhưng mã để chuyển đổi sang yyyy-mm-dd có dấu gạch ngang là 121.

Nếu tôi có thể truy cập vào hộp xà phòng của mình trong một giây, loại định dạng này không thuộc về tầng dữ liệu và đó là lý do không thể thực hiện được nếu không có 'thủ thuật' ngớ ngẩn cho đến SQL Server 2008 khi các loại dữ liệu theo ngày thực tế là giới thiệu. Thực hiện các chuyển đổi như vậy trong tầng dữ liệu là một sự lãng phí rất lớn đối với DBMS của bạn, nhưng quan trọng hơn, lần thứ hai bạn làm điều gì đó như thế này, về cơ bản bạn đã tạo ra dữ liệu mồ côi trong bộ nhớ mà tôi cho rằng bạn sẽ quay lại chương trình. Bạn không thể đặt nó trở lại vào cột 3NF + khác hoặc so sánh nó với bất kỳ thứ gì được nhập mà không hoàn nguyên, vì vậy tất cả những gì bạn đã làm được giới thiệu các điểm thất bại và xóa tham chiếu quan hệ.

Bạn LUÔN LUÔN đi trước và trả lại kiểu dữ liệu dateTime của mình cho chương trình gọi điện và trong lớp TRÌNH BÀY, thực hiện mọi điều chỉnh là cần thiết. Ngay khi bạn chuyển đổi mọi thứ trước khi trả lại chúng cho người gọi, bạn sẽ loại bỏ mọi hy vọng về tính toàn vẹn tham chiếu khỏi ứng dụng. Điều này sẽ ngăn hoạt động CẬP NHẬT hoặc XÓA, một lần nữa, trừ khi bạn thực hiện một số thao tác đảo ngược thủ công, một lần nữa làm lộ dữ liệu của bạn thành lỗi con người / mã / gremlin khi không có nhu cầu.


1
Ngoại trừ, nếu bạn muốn một truy vấn truy xuất tất cả các bản ghi khớp với ngày do người dùng cung cấp làm phần ngày của trường thời gian nhất định. Chúc may mắn làm điều đó chỉ trong lớp trình bày. (Bạn không cần chuyển đổi, bạn có thể sử dụng số học ngày, nhưng bạn có được ý tưởng bìa)
Andrew Lazarus

1
@Andrew tại sao điều đó lại quan trọng? Bạn nói WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- hoàn toàn không có lý do để tước thời gian khỏi cột.
Aaron Bertrand

1
@AaronBertrand Điều đó chỉ hoạt động giả sử đầu vào @Datecó phần thời gian bằng không. Trong trường hợp điều đó không đúng, bạn vẫn cần biết cách cắt ngắn thời gian phía máy chủ. Tôi đồng ý với câu trả lời này rằng định dạng nên được để lại cho lớp trình bày, nhưng tôi không đồng ý với hàm ý rằng để lại cho mặt trước có nghĩa là bạn không cần phải biết cách cắt ngắn nhanh chóng.
Andrew Lazarus

1
@Andrew tất cả những gì bạn phải làm là tạo tham số đầu vào DATE. Quan điểm của tôi vẫn là bạn không bao giờ phải áp dụng bất kỳ sự cắt ngắn nào như vậy cho cột , mặc dù đó là bản năng đầu tiên của hầu hết mọi người.
Aaron Bertrand

1
@AaronBertrand và rằng giả sử bạn có thể kiểm soát các kiểu dữ liệu của tham số. Phạt trong một thủ tục được lưu trữ, không phải là có thể trong các tình huống khác. Tại sao không chọn để chắc chắn tham số là loại bạn muốn và cần?
Andrew Lazarus

10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Chỉnh sửa: Hai phương thức đầu tiên về cơ bản là giống nhau và thực hiện chuyển đổi sang phương thức varchar.


1
Những phương pháp này đều tuyệt vời, nhưng bạn đề nghị sử dụng phương pháp nào?
eddiegroves

3
Lưu ý rằng phiên bản "đúng" trong top hai là select dateadd(dd, datediff(dd, 0, getdate()), 0), vì dds sau đó có thể được hoán đổi cho bất kỳ các dateparttừ khóa clip ngày tại bất cứ đoạn mà bạn chọn. (Cũng lưu ý rằng đó ddchỉ là viết tắt của day.)
Michael - Where's Clay Shirky

10

Để có được kết quả được chỉ định, tôi sử dụng lệnh sau.

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

Tôi holpe nó là hữu ích.


8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

7

Nếu bạn đang gán kết quả cho một cột hoặc biến, hãy đặt cho nó loại DATE và chuyển đổi là ẩn.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

6

Tôi nghĩ rằng điều này sẽ làm việc trong trường hợp của bạn:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

2
Đề nghị này đã được bao phủ bởi các câu trả lời khác (hơn một lần).
Andriy M

6

Được rồi, mặc dù tôi hơi muộn :), đây là một giải pháp khác.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Kết quả

2008-09-22 00:00:00.000

Và nếu bạn đang sử dụng SQL Server 2012 trở lên thì bạn có thể sử dụng FORMAT()chức năng như thế này -

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

Ví dụ đầu tiên của bạn vẫn có một thành phần thời gian. Điểm của câu hỏi là làm thế nào để loại bỏ điều đó.
Zack

5

Ngay cả khi sử dụng Máy chủ MSSQL 7.0 cổ đại, mã ở đây (lịch sự của liên kết này ) cho phép tôi nhận bất kỳ định dạng ngày nào tôi đang tìm kiếm tại thời điểm đó:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

Nó tạo ra đầu ra này:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

5

Ngày:

CHỌN CHUYỂN ĐỔI (ngày, GETDATE ())
CHỌN CAST (GETDATE () là ngày)

Thời gian:

CHỌN CHUYỂN ĐỔI (thời gian, GETDATE (), 114)
CHỌN CAST (GETDATE () theo thời gian)

5

Đơn giản là bạn có thể làm theo cách này:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Đầu ra là:

2008-09-22 00:00:00.000

Hoặc đơn giản là làm như thế này:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Kết quả:

Date Part Only
--------------
2013-07-14

4

tại sao bạn không sử dụng DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

VÍ DỤ: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

bạn có thể thay đổi chuỗi m, d và năm bằng cách sắp xếp lại '%d-%m-%Y'một phần


4

Tôi biết cái này đã cũ, nhưng tôi không thấy ai nói nó theo cách này. Từ những gì tôi có thể nói, đây là tiêu chuẩn ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Sẽ tốt hơn nếu Microsoft cũng có thể hỗ trợ biến CURRENT_DATE tiêu chuẩn ANSI.


select {fn current_date()} as todaylàm việc cho tôi
brianary

@brianary - Điều đó thật tuyệt, nhưng đó không phải là ANSI SQL.
thắp sáng

Điều đó đủ công bằng và câu trả lời của bạn rất dễ mang theo, nhưng tôi đoán chừng nào chúng ta đang làm việc xung quanh T-SQL, thì điều này cũng hiệu quả (và cho thấy việc triển khai ANSI CURRENT_DATE sẽ không quan trọng đối với MS).
brianary

4

Tôi ủng hộ những điều sau đây không được đề cập:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Nó cũng không quan tâm đến địa phương hoặc thực hiện chuyển đổi kép - mặc dù mỗi 'datepart' có thể làm toán. Vì vậy, nó có thể chậm hơn một chút so với phương pháp dateiff, nhưng với tôi nó rõ ràng hơn nhiều. Đặc biệt là khi tôi muốn nhóm chỉ theo năm và tháng (đặt ngày là 1).


4

Bắt đầu từ SQL SERVER 2012, bạn có thể làm điều này:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')


4

Trên máy chủ SQL 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

4

Trong trường hợp này, chỉ ngày, bạn sẽ chạy truy vấn này:

CHUYỂN ĐỔI CHỌN (VARCHAR (10), getdate (), 111);nhập mô tả hình ảnh ở đây


Đây phải là câu trả lời được chấp nhận.
lập trình

3

Bạn có thể sử dụng sau đây cho phần ngày và định dạng ngày:

DATENAME => Trả về một chuỗi ký tự đại diện cho ngày tháng được chỉ định của ngày đã chỉ định

DATEADD => DATEPART()Hàm được sử dụng để trả về một phần của ngày / giờ, chẳng hạn như năm, tháng, ngày, giờ, phút, v.v.

DATEPART => Trả về một số nguyên biểu thị ngày tháng được chỉ định của ngày đã chỉ định.

CONVERT()=> CONVERT()Hàm là một hàm tổng quát chuyển đổi biểu thức của một loại dữ liệu sang loại khác. Các CONVERT()chức năng có thể được sử dụng để hiển thị dữ liệu ngày / giờ trong các định dạng khác nhau.

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.