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 đó?
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 đó?
Câu trả lời:
Trên SQL Server 2008
và cao hơn, bạn nên CONVERT
hẹ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:
varchar
<-> datetime
chuyển đổi cần thiếtlocale
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
datetime
dữ 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.
CAST(... AS DATE)
hoặc CONVERT(DATE, ...)
, đã được đề cập khá thường xuyên trên chính trang này.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
vì sau đó dd
có thể hoán đổi cho bất kỳ datepart
từ khóa nào khác để cắt ngắn của bạn datetime
ở mức độ tùy ý.
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())
Nếu sử dụng SQL 2008 trở lên:
select cast(getdate() as date)
DateTime2
thay thế và nó hoạt động tốt. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
do DateTime
hạ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
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ó là 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.
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.
mm/dd/yyyy
định dạng.
Để 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)
Bạn có thể sử dụng CONVERT
chức năng để chỉ trả về ngày. Xem (các) liên kết dưới đây:
Thao tác ngày và giờ trong SQL Server 2000
Cú pháp sử dụng hàm convert là:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014 / 03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014 / 03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014 / 03-26 00: 00: 00.000
Sử dụng FLOOR () - chỉ cần cắt phần thời gian.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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).
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)
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 2011年10月1日
Nếu bạn muốn nhiều định dạng hơn, bạn có thể truy cập:
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.
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.
@Date
có 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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, vì dd
s sau đó có thể được hoán đổi cho bất kỳ các datepart
từ khóa clip ngày tại bất cứ đoạn mà bạn chọn. (Cũng lưu ý rằng đó dd
chỉ là viết tắt của day
.)
Để 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.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
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
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
Đượ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')
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
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)
Đơ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
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
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 today
làm việc cho tôi
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).
Trong trường hợp này, chỉ ngày, bạn sẽ chạy truy vấn này:
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.