2011-11-14 85 views

Trả lời

185

SQL Server có để làm với một ngày và thời gian!

Nó chỉ là một biểu diễn nhị phân của một số liên tiếp - nó chỉ tốt để đảm bảo một hàng không thay đổi kể từ khi nó được đọc.

Trong phiên bản mới hơn của SQL Server, nó được gọi là RowVersion - vì đó thực sự là những gì nó được. Xem số MSDN docs on ROWVERSION:

Là loại dữ liệu cho thấy số nhị phân được tạo tự động duy nhất trong cơ sở dữ liệu. rowversion thường được sử dụng như một cơ chế cho các hàng bảng dán phiên bản. Loại dữ liệu chuyển đổi hàng là chỉ là số gia tăng và không giữ ngày hoặc thời gian. Để ghi lại ngày hoặc giờ, hãy sử dụng datetime2 loại dữ liệu.

Vì vậy, bạn không có thể chuyển đổi một SQL Server TIMESTAMP vào một ngày/giờ - nó chỉ là không phải là một ngày/giờ. Tuy nhiên, nếu bạn đang nói dấu thời gian nhưng thực sự bạn có nghĩa là một cột DATETIME - thì bạn có thể sử dụng bất kỳ định dạng ngày hợp lệ nào được mô tả trong chủ đề CAST and CONVERT trong trợ giúp MSDN. Chúng được SQL Server định nghĩa và hỗ trợ "out of the box". Mọi thứ khác không được hỗ trợ, ví dụ: bạn phải thực hiện rất nhiều thao tác đúc thủ công và ghép nối (không được khuyến nghị).

Các định dạng mà bạn đang tìm kiếm trông hơi giống như ODBC kinh điển (style = 121):

DECLARE @today DATETIME = SYSDATETIME() 

SELECT CONVERT(VARCHAR(50), @today, 121) 

cho:

2011-11-14 10:29:00.470 

SQL Server 2012 will finally have a FORMAT function để làm định dạng tùy chỉnh ... ...

+1

Có lẽ là con đường lớn nhất của tôi với SQL Server. Tại sao gọi nó là một dấu thời gian nếu tôi không thể nói thời gian với nó? – BelgoCanadian

+0

@BelgoCanadian: hỏi Sybase - đó là một tính năng đã tồn tại trong Sybase/SQL Server mãi mãi ..... –

2

Đồng nghiệp của tôi đã giúp tôi với điều này:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*) 
from table where <tms_column> > '2012-09-10' 
group by CONVERT(VARCHAR(10), <tms_column>, 112); 

hoặc

select CONVERT(DATE, <tms_column>, 112), count(*) 
from table where <tms_column> > '2012-09-10' 
group by CONVERT(DATE, <tms_column>, 112); 
3

trình tốt, ngoại trừ tin nhắn này:

Implicit chuyển đổi từ kiểu dữ liệu varchar để timestamp không được phép. Sử dụng chức năng CONVERT để chạy truy vấn này

Vì vậy, có, dấu thời gian (rowversion) là KHÔNG một NGÀY :)

Thành thật mà nói, tôi fidddled xung quanh khá nhiều thời gian bản thân mình để tìm một cách để chuyển nó sang một buổi hẹn hò.

Cách tốt nhất là chuyển đổi thành INT và so sánh. Đó là những gì loại này có nghĩa là để được. Nếu Bạn muốn có một ngày - chỉ cần thêm một hàng Datetime và sống happyly mãi mãi về sau :)

cổ vũ mac

0

tại sao không thử FROM_UNIXTIME (unix_timestamp, định dạng)

+10

Vì câu hỏi này đề cập đến SQL của Microsoft, chứ không phải MySQL. –

2

Một số trong số họ thực sự làm bí mật để một ngày giờ từ SQL Server 2008 trở đi.

Hãy thử truy vấn SQL sau đây và bạn sẽ thấy cho chính mình:

select CAST (0x00009CEF00A25634 as datetime) 

trên sẽ dẫn đến 2009/12/30 09: 51: 03: 000 nhưng tôi đã gặp những người mà thực sự làm không ánh xạ đến một ngày giờ.

5

Sử dụng đúc bạn có thể nhận cập nhật từ một lĩnh vực timestamp:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name 
+2

Điều này dường như không hoạt động: 'Không được phép chuyển đổi rõ ràng từ dấu thời gian kiểu dữ liệu thành ngày.' – jocull

-2

Không chắc chắn nếu tôi là thiếu một cái gì đó ở đây nhưng có thể bạn không chỉ cần chuyển đổi các dấu thời gian như thế này:

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110) 
+0

Bạn đã thử cái này chưa? TIMESTAMP không có liên quan đến DATE. –

+0

Tôi đang sử dụng nó trên SQL Server 2008 – Daniel

2

Cách đơn giản nhất để thực hiện việc này là:

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`; 

Cột này cung cấp cột ngày ở định dạng có thể đọc được . Nếu bạn muốn thay đổi định dạng te, hãy bấm here.

+0

có vẻ như không cho các phiên bản cũ của sql? Tôi không thể tìm thấy nó với sql 2014 .. – pungggi

Các vấn đề liên quan