SQL Server TIMESTAMP
datatype memiliki apa-apa hubungannya dengan tanggal dan waktu!
Ini hanyalah representasi heksadesimal dari bilangan bulat 8 byte berturut-turut - ini hanya bagus untuk memastikan baris tidak berubah sejak dibaca.
Anda dapat membaca bilangan bulat heksadesimal atau jika Anda menginginkan file BIGINT
. Sebagai contoh:
SELECT CAST (0x0000000017E30D64 AS BIGINT)
Hasilnya adalah
400756068
Di versi SQL Server yang lebih baru, ini disebut RowVersion
- karena memang seperti itulah. Lihat dokumen MSDN di ROWVERSION :
Adalah tipe data yang mengekspos bilangan biner unik yang dibuat secara otomatis dalam database. rowversion umumnya digunakan sebagai mekanisme untuk baris tabel cap versi. Tipe data rowversion hanyalah sebuah angka yang bertambah dan tidak menyimpan tanggal atau waktu . Untuk merekam tanggal atau waktu, gunakan tipe data datetime2.
Jadi, Anda tidak dapat mengubah SQL Server TIMESTAMP
menjadi tanggal / waktu - ini bukan tanggal / waktu.
Tetapi jika Anda mengatakan stempel waktu tetapi yang Anda maksud adalah DATETIME
kolom - maka Anda dapat menggunakan salah satu format tanggal valid yang dijelaskan dalam topik CAST dan CONVERT di bantuan MSDN. Mereka didefinisikan dan didukung "di luar kotak" oleh SQL Server. Ada lagi yang tidak didukung, misalnya Anda harus melakukan banyak casting manual dan penggabungan (tidak disarankan).
Format yang Anda cari terlihat seperti kanonik ODBC (style = 121):
DECLARE @today DATETIME = SYSDATETIME()
SELECT CONVERT(VARCHAR(50), @today, 121)
memberikan:
2011-11-14 10:29:00.470
SQL Server 2012 akhirnya akan memiliki FORMAT
fungsi untuk melakukan pemformatan kustom ......
TIMESTAMP
jenis kolomCara termudah untuk melakukannya adalah:
SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;
Ini memberikan kolom tanggal setidaknya dalam format yang dapat dibaca. Selanjutnya jika Anda ingin mengubah format te klik di sini .
sumber
Dengan menggunakan cast Anda bisa mendapatkan tanggal dari kolom timestamp:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
sumber
Explicit conversion from data type timestamp to date is not allowed.
Rekan kerja saya membantu saya dengan ini:
select CONVERT(VARCHAR(10), <tms_column>, 112), count(*) from table where <tms_column> > '2012-09-10' group by CONVERT(VARCHAR(10), <tms_column>, 112);
atau
select CONVERT(DATE, <tms_column>, 112), count(*) from table where <tms_column> > '2012-09-10' group by CONVERT(DATE, <tms_column>, 112);
sumber
Berfungsi dengan baik, kecuali pesan ini:
Jadi ya,
TIMESTAMP
(RowVersion
) BUKAN TANGGAL :)Sejujurnya, saya mengotak-atik beberapa waktu sendiri untuk menemukan cara mengubahnya menjadi kencan.
Cara terbaik adalah mengonversinya menjadi
INT
dan membandingkan. Untuk itulah tipe ini dimaksudkan.Jika Anda ingin kencan - cukup tambahkan
Datetime
kolom dan hidup bahagia selamanya :)cheers mac
sumber
"Anda tetap menggunakan kata itu. Saya tidak berpikir itu berarti apa yang Anda pikirkan." - Inigo Montoya
Stempel waktu sama sekali tidak memiliki hubungan dengan waktu seperti yang awalnya dikatakan marc_s.
declare @Test table ( TestId int identity(1,1) primary key clustered ,Ts timestamp ,CurrentDt datetime default getdate() ,Something varchar(max) ) insert into @Test (Something) select name from sys.tables waitfor delay '00:00:10' insert into @Test (Something) select name from sys.tables select * from @Test
Perhatikan dalam output bahwa Ts (hex) bertambah satu untuk setiap record, tetapi waktu aktual memiliki jeda 10 detik. Jika dikaitkan dengan waktu maka akan ada celah di cap waktu untuk menyesuaikan dengan perbedaan waktu.
sumber
Setelah melakukan konversi ke integer CONVERT (BIGINT, [timestamp]) sebagai Timestamp saya mendapatkan hasil seperti
Ya, ini bukan tanggal dan waktu, Ini nomor seri
sumber
untuk saya bekerja: TO_DATE ('19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)
sumber
Saya memiliki masalah yang sama dengan cap waktu misalnya: '29 -JUL-20 04.46.42.000000000 PM '. Saya ingin mengubahnya menjadi format 'yyyy-MM-dd'. Solusi yang akhirnya berhasil untuk saya adalah
PILIH TO_CHAR (stempel waktu saya, 'YYYY-MM-DD') DARI mytable;
sumber
Saya akan berasumsi bahwa Anda telah melakukan dump data sebagai pernyataan masukkan, dan Anda (atau siapa pun Googles ini) mencoba untuk mencari tahu tanggal dan waktu, atau menerjemahkannya untuk digunakan di tempat lain (misalnya: untuk mengubah ke sisipan MySQL). Ini sebenarnya mudah dalam bahasa pemrograman apa pun.
Mari bekerja dengan ini:
CAST(0x0000A61300B1F1EB AS DateTime)
Representasi Hex ini sebenarnya adalah dua elemen data yang terpisah ... Tanggal dan Waktu. Empat byte pertama adalah tanggal, empat byte kedua adalah waktu.
Ubah kedua segmen menjadi bilangan bulat menggunakan bahasa pemrograman pilihan Anda (ini adalah konversi hex langsung ke bilangan bulat, yang didukung di setiap bahasa pemrograman modern, jadi, saya tidak akan menyia-nyiakan ruang dengan kode yang mungkin atau mungkin bukan bahasa pemrograman Anda sedang bekerja).
Sekarang, apa yang harus dilakukan dengan bilangan bulat tersebut:
Tanggal
Tanggal sejak 01/01/1900, dan direpresentasikan sebagai hari. Jadi, tambahkan 42.515 hari ke 01/01/1900, dan hasilnya adalah 05/27/2016.
Waktu
Waktu sedikit lebih kompleks. Ambil INT itu dan lakukan hal berikut untuk mendapatkan waktu Anda dalam mikrodetik sejak tengah malam (pseudocode):
Dari sana, gunakan panggilan fungsi favorit bahasa Anda untuk menerjemahkan mikrodetik (38872676666,7 µs pada contoh di atas) menjadi waktu.
Hasilnya akan menjadi 10: 47: 52.677
sumber
Beberapa dari mereka benar-benar terselubung ke tanggal-waktu dari SQL Server 2008 dan seterusnya.
Coba kueri SQL berikut dan Anda akan melihatnya sendiri:
SELECT CAST (0x00009CEF00A25634 AS datetime)
Di atas akan menghasilkan
2009-12-30 09:51:03:000
tetapi saya telah menemukan yang sebenarnya tidak memetakan ke tanggal-waktu.sumber
Mengapa tidak mencobanya
FROM_UNIXTIME(unix_timestamp, format)
?sumber
Tidak yakin apakah saya melewatkan sesuatu di sini tetapi tidak bisakah Anda mengonversi stempel waktu seperti ini:
sumber