Ubah kolom datetime menjadi beberapa detik

11

Dalam database SQL Server saya, saya punya datetimekolom.

Apa cara yang baik untuk membuat kolom baru yang mewakili longnilai untuk datetimekolom? Itu longakan mewakili beberapa detik.

Saya pikir jika saya dapat mengonversikannya longs, akan lebih mudah untuk melakukan pengelompokan berdasarkan kueri selama periode waktu tertentu, karena saya bisa membagi bilangan panjang dengan jumlah tetap.

Tabelnya statis, tidak akan memperbarui atau menghapus data.

dublintech
sumber

Jawaban:

13

Buat kolom baru (ALTER TABLE) kemudian jalankan PEMBARUAN di atasnya

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101adalah zaman SQL Server. Anda dapat menggunakan 19700101untuk zaman Unix misalnya

gbn
sumber
12

Anda dapat menambahkan kolom baru dan memperbaruinya secara manual seperti yang disarankan @gbn, tetapi sekarang Anda harus terus-menerus memperbarui kolom ini dengan memasukkan / memperbarui pemicu atau mekanisme lainnya. Meminjam dugaan @ gbn pada nama tabel / kolom, berikut adalah beberapa pendekatan berbeda yang tidak memerlukan pemeliharaan konstan.

Kolom yang Dihitung

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

Anda juga dapat bertahan dan mengindeks kolom ini, menukarkan kinerja permintaan untuk penyimpanan, tetapi Anda harus melakukan sedikit perubahan pada perhitungan (mencoba bertahan di atas akan menghasilkan kesalahan tentang perhitungan yang bersifat non-deterministik):

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

Anda ingin mempertahankan kolom jika Anda lebih mementingkan kinerja baca daripada kinerja menulis (atau penyimpanan).

Melihat

Salah satu manfaat dari tampilan kolom baru adalah Anda tidak perlu mengubah skema tabel dasar (atau khawatir tentang selalu memperbaruinya). Anda membayar biaya perhitungan pada waktu kueri, yang sama dengan kolom yang dihitung tetap.

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

Runtime

Karena perhitungan di atas tidak terlalu rumit, cukup sertakan perhitungan dalam kueri Anda. Semoga Anda menggunakan prosedur tersimpan untuk akses data sehingga Anda tidak sering mengulanginya.

Aaron Bertrand
sumber