แปลงคอลัมน์วันที่และเวลาเป็นจำนวนวินาที


11

ในฐานข้อมูล SQL Server ของฉันฉันมีdatetimeคอลัมน์

เป็นวิธีที่ดีในการสร้างคอลัมน์ใหม่ที่แสดงlongค่าสำหรับdatetimeคอลัมน์อย่างไร longจะเป็นตัวแทนจำนวนวินาที

ฉันคิดว่าถ้าฉันสามารถแปลงเป็นlongsมันจะทำให้ง่ายขึ้นในการจัดกลุ่มตามข้อความค้นหาในช่วงเวลาเนื่องจากฉันสามารถแบ่งจำนวนยาวด้วยจำนวนคงที่ได้

ตารางคงที่จะไม่อัปเดตหรือลบข้อมูล

คำตอบ:


13

สร้างคอลัมน์ใหม่ (ALTER TABLE) จากนั้นเรียกใช้ UPDATE

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

19000101ยุคของ SQL Server คุณสามารถใช้19700101สำหรับ Unix epoch ได้


12

คุณสามารถเพิ่มคอลัมน์ใหม่และอัปเดตด้วยตนเองตามที่ @gbn แนะนำ แต่ตอนนี้คุณต้องปรับปรุงคอลัมน์นี้ให้ทันสมัยอยู่เสมอด้วยทริกเกอร์การแทรก / อัปเดตหรือกลไกอื่น ๆ การขอยืม @ gbn เป็นการเดาชื่อตาราง / คอลัมน์ต่อไปนี้เป็นวิธีการต่าง ๆ ที่ไม่ต้องการการบำรุงรักษาอย่างต่อเนื่อง

คอลัมน์ที่คำนวณ

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));

คุณยังสามารถคงอยู่และจัดทำดัชนีคอลัมน์นี้ซื้อขายประสิทธิภาพการค้นหาสำหรับการจัดเก็บ แต่คุณจะต้องทำการเปลี่ยนแปลงเล็กน้อยในการคำนวณ (การพยายามคงอยู่ข้างต้นจะทำให้เกิดข้อผิดพลาดเกี่ยวกับการคำนวณที่ไม่ได้กำหนดไว้):

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;

คุณต้องการคงคอลัมน์ไว้หากคุณกังวลเกี่ยวกับประสิทธิภาพการอ่านมากกว่าการเขียน (หรือที่เก็บข้อมูล)

ดู

ข้อดีอย่างหนึ่งของมุมมองในคอลัมน์ใหม่คือคุณไม่ต้องเปลี่ยนสคีมาตารางพื้นฐาน (หรือกังวลเกี่ยวกับการทำให้เป็นปัจจุบัน) คุณชำระค่าใช้จ่ายในการคำนวณ ณ เวลาสอบถามซึ่งเหมือนกับคอลัมน์ที่คำนวณได้แบบไม่ยืนยัน

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

Runtime

เนื่องจากการคำนวณข้างต้นไม่ซับซ้อนเกินไปให้รวมการคำนวณในข้อความค้นหาของคุณ หวังว่าคุณกำลังใช้โพรซีเดอร์ที่เก็บไว้สำหรับการเข้าถึงข้อมูลดังนั้นคุณจึงไม่ต้องทำซ้ำบ่อยๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.