2008-08-14 80 views
37

Trong SQL Server, tôi có cột DATETIME bao gồm phần tử thời gian.So sánh một chuỗi ngày với datetime trong SQL Server?

Ví dụ:

'14 AUG 2008 14:23:019' 

các tốt nhất phương pháp để chỉ chọn các hồ sơ cho một ngày cụ thể, bỏ qua phần thời gian là gì?

Ví dụ: (Không an toàn, vì nó không phù hợp với bán thời gian và trả về không có hàng)

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime = @p_date 

Lưu ý: Với trang web này cũng là về đoạn ngắn ghi nhanh xuống ghi chú và kỹ thuật mà bạn nhặt và sau đó quên , Tôi sẽ đăng câu trả lời của riêng tôi cho câu hỏi này như là công cụ DATETIME trong MSSQL có lẽ là chủ đề tôi tra cứu nhất trong SQLBOL.


Cập nhật làm rõ ví dụ để cụ thể hơn.


Sửa Xin lỗi, nhưng tôi đã có câu trả lời WRONG xuống-mod (câu trả lời mà trả lại kết quả sai).

@Jit: WHERE (date>'20080813' AND date<'20080815') sẽ trả về ngày 13 và ngày 14.

@wearejimbo: Đóng, nhưng không có xì gà! huy hiệu được trao cho bạn. Bạn bỏ lỡ biên bản tại 14/08/2008 23: 59: 001-23: 59: (. Tức là ít hơn 1 giây trước nửa đêm) 999

Trả lời

35

Kỹ thuật 1:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE column_datetime >= @p_date 
AND  column_datetime < DATEADD(d, 1, @p_date) 

Ưu điểm của việc này là nó sẽ sử dụng bất kỳ chỉ mục nào trên 'column_datetime' nếu nó tồn tại.

+11

Tôi tin rằng CAST ('14 Tháng 8 năm 2008' như DateTime) là tốt hơn một chút. Tôi nghĩ rằng nó dễ đọc hơn một chút và tôi tin rằng CAST dễ di chuyển hơn CONVERT() trong CAST() tương thích với ANSI SQL-92 và -99 –

+1

Bạn có thể sử dụng từ khóa BETWEEN làm cách viết tắt cho câu trả lời này. –

+1

@BorhanMooz, trên thực tế, GIỮA GIỮ không nắm bắt được> =/<độ lệch được đưa ra trong mã. GIỮA là hoàn toàn bao gồm (http://technet.microsoft.com/en-us/library/ms187922.aspx, "Giá trị kết quả"). – NargothBond

1
SELECT * 
FROM table1 
WHERE CONVERT(varchar(10),columnDatetime,121) = 
     CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121) 

Điều này sẽ chuyển đổi thời gian dữ liệu và chuỗi thành biến thể của định dạng "YYYY-MM-DD".

này là rất xấu xí, nhưng nên làm việc

4

Kỹ thuật 2:

DECLARE @p_date DATETIME 
SET  @p_date = CONVERT(DATETIME, '14 AUG 2008', 106) 

SELECT * 
FROM table1 
WHERE DATEDIFF(d, column_datetime, @p_date) = 0 

Nếu trường column_datetime không lập chỉ mục, và dường như không thể (hoặc chỉ số này khó có khả năng được sử dụng) sau đó sử dụng hàm DATEDIFF() ngắn hơn.

8

Chỉ cần so sánh giá trị năm, tháng và ngày.

Declare @DateToSearch DateTime 
Set @DateToSearch = '14 AUG 2008' 

SELECT * 
FROM table1 
WHERE Year(column_datetime) = Year(@DateToSearch) 
     AND Month(column_datetime) = Month(@DateToSearch) 
     AND Day(column_datetime) = Day(@DateToSearch) 
3

Chức năng này Cast (Tầng (Cast (getdate() As Float)) Như DateTime) trả về một kiểu dữ liệu datetime với phần thời gian loại bỏ và có thể được sử dụng như vậy.

Select 
* 
Table1 
Where 
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008' 

hoặc

DECLARE @p_date DATETIME 
SET  @p_date = Cast('14 AUG 2008' as DateTime) 

SELECT * 
FROM  table1 
WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date 
+0

Sẽ không có nhiều chức năng được áp dụng cho trường (nếu được lập chỉ mục) chuyển đổi nó thành quét toàn bộ bảng? –

1

Tôi biết điều này là không chính xác làm thế nào bạn muốn làm điều này, nhưng nó có thể là một sự khởi đầu:

SELECT * 
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
     DATEPART(mm, column_dateTime) as Month, 
     DATEPART(dd, column_dateTime) as Day 
     FROM table1) 
WHERE Year = '2008' 
AND Month = '8' 
AND Day = '14' 
4

Something như thế này?

SELECT * 
FROM table1 
WHERE convert(varchar, column_datetime, 111) = '2008/08/14' 
14

Trong SQL Server 2008, bạn có thể sử dụng NGÀY datatype mới

DECLARE @pDate DATE='2008-08-14' 

SELECT colA, colB 
FROM table1 
WHERE convert(date, colDateTime) = @pDate 

@ Guy. Tôi nghĩ rằng bạn sẽ thấy rằng giải pháp này quy mô tốt. Hãy xem số query execution plan truy vấn ban đầu của bạn.

Và đối với mine:

3

Làm thế nào để có được những phần NGÀY của một trường DATETIME trong MS SQL Server:

Một trong những nhanh nhất và cách thú vị nhất để làm điều này là sử dụng

DATEADD(dd, DATEDIFF(dd, 0, @DAY), 0) 

Nó tránh sự phá vỡ CPU "chuyển đổi ngày thành một chuỗi mà không có thời gian và sau đó chuyển đổi nó trở lại một lần nữa" logic.

Nó cũng không trưng ra việc triển khai nội bộ mà "phần thời gian được biểu thị dưới dạng phân số" của ngày.

Lấy ngày trong ngày đầu tiên của tháng

DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0) 

Lấy rfom ngày 1 năm trước

DATEADD(m,-12,DATEADD(dd, DATEDIFF(dd, -1, GetDate() - DAY(GetDate())), 0)) 
0
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp 
1
DECLARE @Dat 

SELECT * 
FROM Jai 
WHERE                           
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                
      CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+    
        CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat 
4

Good điểm về chỉ số trong câu trả lời bạn đã chấp nhận.

Tuy nhiên, nếu bạn thực sự tìm kiếm chỉ vào cụ thể DATE hoặc DATE rangesthường, sau đó là giải pháp tốt nhất mà tôi tìm thấy là để thêm một tồn cột tính để bàn của bạn mà sẽ chỉ chứa các DATE, và thêm chỉ mục trên cột này:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED 

Thêm chỉ mục trên cột rằng:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" 
ON "table1" ("column_date" ASC) 
GO 

Sau đó tìm kiếm của bạn sẽ còn nhanh hơn:

DECLARE @p_date DATE 
SET  @p_date = CONVERT(DATE, '14 AUG 2008', 106) 

SELECT * 
FROM  table1 
WHERE column_date = @p_date 
+0

và sau đó, tôi đề xuất sử dụng một trong các định dạng ISO cho những ngày mà hầu hết cơ sở dữ liệu nhận ra và không phụ thuộc vào ngôn ngữ/ngôn ngữ, như 'YYYY-MM-DD' – van

-1

Trong SQLServer

DECLARE @p_date DATE 

SELECT * 
FROM table1 
WHERE [email protected]_date 

Trong C# Vượt qua chuỗi ngắn của giá trị ngày tháng sử dụng ToShortDateString() chức năng. mẫu: DateVariable.ToShortDateString();

1

Ngày có thể được so sánh trong sqlserver sử dụng so sánh chuỗi: ví dụ:

DECLARE @strDate VARCHAR(15) 
SET @strDate ='07-12-2010' 


SELECT * FROM table 
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112) 
0
SELECT * FROM tablename 
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012' 
3

tôi thường chuyển đổi ngày-thời gian để cập nhật và so sánh chúng, như thế này:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date) 

hoặc

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0 
0

Cách tốt nhất là chỉ cần giải nén phần ngày sử dụng hàm SQL DATE():

SELECT * 
FROM table1 
WHERE DATE(column_datetime) = @p_date; 
0

Có nhiều định dạng cho ngày trong SQL đang được chỉ định. Tham khảo https://msdn.microsoft.com/en-in/library/ms187928.aspx

Chuyển đổi và so sánh cột VARCHAR với các ngày đã chọn.

Cú pháp:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03' 
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy 
Các vấn đề liên quan