Dữ liệu rời rạc và liên tục trong SQL

Hãy xem xét Derf

Hãy xem xét derf. Derf là một số nguyên giữa 5 và 6. Nó đã được tạo ra trong tập phim “iTwins” bởi các nhân vật chính của chương trình truyền hình của trẻ em, iCarly, Carly thấy một đoạn video của Chuck đập lên Spencer, anh trai của cô. Để có được trả thù Chuck, cô tạo nên số Derf, và thủ thuật anh nghĩ nó là một phần của các luật mới Toán quốc tế mà gần đây đã được thông qua bởi các Chuck LHQ sử dụng các số trong bài kiểm tra toán của mình và thất bại nó. Ông mất kỳ nghỉ hè của mình và được gửi đến một trại toán thay thế. Công lý được phục vụ!

Bên cạnh diễn xuất trong các ký họa, tại sao điều này là buồn cười? Nó là vô lý. Mặc dù không có một mức độ toán học, mọi người hiểu rằng số nguyên là “rời rạc”, một thuật ngữ trong toán học trong đó có một ý nghĩa cụ thể, nhưng đại khái có nghĩa là mỗi phần tử trong một tập hợp được biết chính xác, có thể đếm được và không thể chia nhỏ hơn nữa. Không có derf. Có thể không bao giờ là một derf. Không có nơi nào để đặt nó!

Người Computer sống với một thế giới quan hệ nhị phân và rời rạc. Chúng tôi giống như mô hình mà vì nó là đơn giản và nó đã được tốt cho chúng ta. Chúng tôi có thể sống với số nguyên nhị phân và chuỗi ký tự. Chúng tôi có thể đại diện cho những điều riêng biệt với các bảng mã.

Dữ liệu rời rạc và liên tục trong SQL

Nhưng không phải tất cả các dữ liệu rời rạc. Một thay thế cho bộ rời rạc là một sự liên tục. Việc liên tục nhất phổ biến nhất trong một cơ sở dữ liệu là một dấu thời gian và kiểu dữ liệu phổ biến thứ hai là REAL, FLOATPRECISION DOUBLE f amily. Nhưng chúng ta không thể đại diện cho các giá trị liên tục trong một máy tính. Chúng ta phải gần đúng chúng và sống với các lỗi, mô hình chúng trong cấu trúc của ngôn ngữ hay sử dụng ngôn ngữ lập trình thao tác chúng tượng trưng. o: p>

 Các giải pháp tượng trưng được sử dụng trong ngôn ngữ lập trình toán học, nhưng chỉ cho các số bất hợp lý quan trọng, như π, e, và √ 2. Họ hiển thị các tính toán trong hình thức tượng trưng, ​​vì vậy chúng tôi làm việc chăm sóc không nhiều về họ trong các cơ sở dữ liệu bên trong ngôi nhà. SQL không dành cho đồ họa, tính toán nặng, xử lý ngôn ngữ tự nhiên và rất nhiều thứ khác. Đây không phải là một vấn đề nữa với thực tế là một tuốc nơ vít không phải là một cái cưa.

Các “cấu trúc trong ngôn ngữ” phương pháp tiếp cận là quen thuộc với các lập trình FORTRAN cũ. Các FORTRAN đầu chỉ có các mảng và vô hướng. Chúng tôi đã thực sự giỏi sử dụng mảng cho tất cả mọi thứ mà không phải là một yếu tố dữ liệu số vô hướng. Ví dụ, số phức được mô hình hóa như một bằng 2 (n) mảng; chuỗi được thực hiện như là một mảng chiều và vv. Nhưng điều này có nghĩa là các hoạt động cơ bản đã được đóng gói như các chức năng sử dụng hoạt động cơ bản.

 Trong SQL, chúng ta cũng chỉ có một cấu trúc – bàn. Chúng tôi có thể sử dụng các cột liên tiếp trong nhiều cách mà chúng ta sử dụng mảng. Vadim Tropashko đã sử dụng phương pháp này để mô hình số hợp lý trong Oracle như (tử số, mẫu số) cặp và hàm do người dùng định nghĩa. Nhưng điều này vẫn không cho chúng ta thực hiện tốt, một bộ tiêu chuẩn hóa các quy tắc và tiêu chuẩn đại diện. Đó là lý do tại sao chúng tôi có tiêu chuẩn IEEE nổi số điểm ngày hôm nay.

Hãy trở lại để π, mà tôi làm tròn đến 3.14 ở trường trung học, sau đó đến 3,14159 ở trường trung học và cuối cùng là 3,141592653 khi tôi tính bỏ túi đầu tiên của tôi với một màn hình hiển thị mười chữ số. Quay lại trường trung học, tôi đã biết ( 3,14 <π <3,15 ). Khoảng thời gian này chứa π, nhưng tôi làm không chính xác nó ở đâu. Sau khoảng thời gian đã trở thành (3.14159 <π <3,14160) , và tiếp tục để có được nhỏ hơn và nhỏ hơn như tôi có công cụ với nhiều hơn và nhiều hơn chữ số thập phân. Nhưng tôi không bao giờ có thể có được để π. nên thay vì suy nghĩ của π là một điểm rời rạc trên một số dòng như 5 hoặc 6, nghĩ về nó như một “đám mây điểm” mà đã π bên trong nó, một nơi nào đó.

 Các ranh giới của điện toán đám mây là π ± ε. Khi giá trị của phương pháp tiếp cận ε không, tôi nhận được xấp xỉ tốt hơn và tốt hơn trong loạt bài này của bộ vô lồng nhau. Những bộ được gọi là khoảng thời gian mở, vì các điểm kết thúc là không có trong bộ. Đây là khái niệm về một giới hạn; Tôi có thể nhận được gần như là tôi muốn π, nhưng tôi có thể không thực sự có được nó. Trong thế giới thực, một máy tính không thể có độ chính xác vô hạn.Hoặc lưu trữ vô hạn, mặc dù những gì các nhà cung cấp phần cứng của bạn cho bạn biết.

Số dấu chấm động

 Thế nào là những xấp xỉ mô hình trong thế giới hữu hạn của tôi? Hãy bắt đầu với REAL, FLOATDOUBLE PRECISION kiểu dữ liệu, vì họ đã thiết lập tiêu chuẩn (IEEE-754) đã được thực hiện trong phần cứng ngày nay. Bạn có thể nhận được một hướng dẫn chi tiết về số điểm nổi tại: (Complete) Hướng dẫn để hiểu lỗi IEEE Floating-Pointvà tôi khuyên bạn làm điều này. Ngoài ra còn có hướng dẫn tốt, bạn có thể tìm thấy trên internet, quá.

 Quay trở lại những ngày đầu của máy tính, có dấu chấm động độc quyền từ các nhà cung cấp. Các định dạng tất cả làm việc trên cùng một nguyên tắc. Một số được tạo thành từ một phần ba; một cơ sở, một số mũ, và significand (hoặc mantissa cũ hạn). Các cơ sở là một trong hai hoặc mười hai trong thực tế, nhưng có thể là bất kỳ số nguyên trong lý thuyết. Số mũ là số nguyên khác; nó đại diện cho số mũ mà cơ sở được nâng lên trong công thức này:

  ± <significand> * <base> ^ <số mũ>

 Đây là ký hiệu khoa học cổ điển. Các tiêu chuẩn IEEE có nhiều phiên bản. Nhưng phổ biến nhất là:

  • IEEE ngắn Real hoặc duy nhất chính xác là 32 bit (1 bit cho các ký hiệu, 8 bit cho số mũ, và 23 bit cho significand.
  • IEEE Dài Bất động hay chính xác gấp đôi là 64 bit (1 bit cho các ký hiệu, 11 bit cho số mũ, và 52 bit cho significand.

Nếu bạn muốn có một mô hình tinh thần, tưởng tượng ra một tập hợp các điểm lây lan như bụi không đều cách nhau trên một dòng số. Đây là cách chúng tôi có được phạm vi của các giá trị, chúng tôi có trong các số dấu chấm.Nếu chúng ta không thể đánh một trong những điểm này, chúng tôi cố gắng “gần gũi” và học cách sống với các lỗi và xấp xỉ. Chúng tôi cố gắng để giảm thiểu sai sót, tho. Nếu bạn có một số thời gian, google tất cả các thủ thuật và các thuật toán, chúng ta phải sử dụng. Họ là phức tạp! Họ là xấu xí!

Nhưng sự phức tạp được ẩn từ bạn. Bạn không thấy các cơ sở và số mũ được làm bằng theo bao, vì vậy bạn có thể làm thêm. Bạn không thấy các thuật toán phức tạp cho phép nhân và phép chia. Theo bao gồm, chúng tôi đã Epsilon! Khi bạn so sánh nổi số điểm, khu phố epsilon của họ khác nhau tùy theo cách gần bằng không họ.

Tạo một cột thực bảng không có khóa và điền nó với hàng ngàn số dấu chấm động, cả tích cực và tiêu cực. Sau đó làm một SUM () trên đó. Đi cùng bộ dữ liệu, sắp xếp nó theo thứ tự tăng dần sau đó tổng hợp lại một lần nữa. Sắp xếp nó trong thứ tự giảm dần sau đó tổng hợp lại một lần nữa. Cuối cùng, sắp xếp nó là thứ tự tăng dần theo giá trị tuyệt đối, sau đó tổng hợp lại một lần nữa. Bốn tổng số tất cả sẽ là một chút khác nhau trong các chữ số cuối cùng vì nổi điểm sai sót làm tròn tích lũy. Nếu bạn quan tâm, tập sort-by-tuyệt-giá trị sẽ cho kết quả chính xác nhất. Ngôn ngữ làm việc với phao sẽ làm rất nhiều sắp xếp lại các tính toán để giảm thiểu sai sót. Không có sản phẩm SQL Tôi biết điều này; nó sẽ phá hủy hiệu suất. Chúng tôi không quan tâm thêm một chút thời gian khi chúng tôi biên dịch một chương trình FORTRAN vì nhanh, câu trả lời chính xác là quan trọng hơn so với biên dịch nhanh

Để tránh những vấn đề ngày hôm nay, chúng ta có nhiều khả năng để sử dụng DECIMAL (s, p) hoặc số (s, p)các loại dữ liệu để có được kết quả tương đối chính xác hơn để sử dụng REAL, FLOAT hoặc PRECISION DOUBLE .Trong SQL Server, chúng tôi xử lý DECIMAL (s, p)số (s, p) là từ đồng nghĩa, nhưng trong ANSI / ISO tiêu chuẩn điều trị số (s, p) là có chính xác p chữ số thập phân. Đây là để chứa hệ thống với số COBOL-style – chuỗi ký tự. Nhưng DECIMAL (s, p) đã không có ít hơn những nơi p chữ số thập phân. Đây là để chứa hệ thống với số BCD. Nếu bạn lập trình viên trẻ đã không bao giờ nhìn thấy BCD (Binary Coded Decimal), sau đó Google nó. Điều này có nghĩa rằng DECIMAL (s, p) có thể cung cấp tốt hơn so với làm tròn số (s, p) vì các chữ số thêm.

Một yếu tố nữa là khi bạn mô hình tiền, không bao giờ sử dụng Sybase độc quyền cũ MONEYSMALLMONEY kiểu dữ liệu.

  1. Họ là độc quyền, do đó porting nó là một nỗi đau. Nó là một trong những “bảo tàng Mã Sybase” nhiều tính năng từ nhiều thập kỷ trước. Đây là một cách giữ cho các lập trình COBOL hạnh phúc; nó làm cho SQL nhìn như nó có một PICTURE khoản mà các cửa hàng một ký hiệu tiền tệ, dấu phẩy và dấu chấm thập phân trong các dữ liệu.
  2. Viết code trong phương ngữ khi bạn không cần phải làm cho bạn âm thanh như một người ở miền núi với những người nói tiếng. Bạn đang tốt hơn với DECIMAL (s, p) , do đó bạn có thể sử dụng một cột đúng kích cỡ.
  3. Nó vi phạm nhiều quy tắc GAPP và EU hiện nay về độ chính xác và quy tắc làm tròn số. Bạn cần phải nghiên cứu chỉ là những gì các luật và quy định trong ngành công nghiệp của bạn.
  4. Các TIỀN kiểu dữ liệu đã làm tròn số lỗi. Sử dụng nhiều hơn một hoạt động (nhân hay bộ phận) trên cột tiền sẽ tạo ra những lỗi làm tròn nặng. Một cách đơn giản để hình số học tiền là để đặt một ROUND () chức năng cuộc gọi sau mỗi hoạt động.Ví dụ,số tiền = (phần / total_amt) * gross_amt; số tiền = ROUND (ROUND (phần / total_amt, 4) * gross_amt, 4); DECLARE MONEYgross_amt, MONEYmy_part, FLOATfloat_result,  SETtotal_amt = 7.328,75;  SETfloat_result = (my_part /total_amt) *gross_amt; / CAST (total_amt AS FLOAT)) END;money_result = 13.525,09 – không chính xácall_floats = 13.530,5038673171 – chính xác, với một lỗi -5,42
  5.  @ Mon1 MONEY, @ mon2 MONEY, @ mon3 MONEY, @ mon4 MONEY,  @ Mon1 = 100, @ mon2 = 339, @ mon3 = 10000,  SET @ num4 = @ num1 / @ num2 * @ num3;SET @ num5 = @ num1 / @ num2;SET @ num5 = @ num5 * @ num3;SELECT @ mon4 AS money_result, @ Num5 AS numeric_result_2;
  6.  @ Num4 AS numeric_result,
  7. SET @ mon4 = @ mon1 / @ mon2 * @ mon3;
  8.  @ Num1 = 100, @ num2 = 339, @ num3 = 10000;
  9. CHỌN
  10.  @ Num1 DECIMAL (19, 4), @ num2 DECIMAL (19, 4), @ num3 DECIMAL (19, 4), @ num4 DECIMAL (19, 4), @ num5 DECIMAL (19, 4);
  11. float_result = 13525.0885 – không chính xác
  12.  CHỌNmoney_result,float_result,all_floats;
  13.  * CAST (gross_amt AS FLOAT);
  14.  SET @ Retult3 = (CAST (my_part AS FLOAT)
  15.  SETmoney_result = (my_part /total_amt) *gross_amt;
  16.  SETmy_part = 1.793,33;
  17.  SETgross_amt = 55.294,72;
  18.  all_floats phao;
  19.  MONEYmoney_result,
  20.  MONEYtotal_amt,
  21. BEGIN
  22. Một ví dụ khác:
  23.  Làm tròn đến bốn chữ số thập phân có thể không có vẻ là một vấn đề, cho đến khi các con số mà bạn đang sử dụng lớn hơn 10, 000.
  24. có thể được viết lại bằng cách sử dụng số học tiền như:

Thời gian, Continuum khác

Việc liên tục khác trong SQL là dấu thời gian, mà là DATETIME2 (n) trong SQL Server. Bản chất của thời gian là rất khác nhau từ các số thực. Một số lượng không thứ nguyên là một đại lượng mà không có một không gian vật chất liên quan. Thời gian là một chiều để đo sự chuyển động của các đối tượng. Thời gian di chuyển và di chuyển theo một hướng. Có một câu chuyện đùa về một người cha thấy đứa con trai nhỏ của mình, người đã chỉ nhìn thấy đồng hồ kỹ thuật số và đồng hồ, một chiếc đồng hồ bỏ túi cũ với một bàn tay thứ hai quét.

  1. “Nó là gì, Daddy?”
  2. “Đó là một chiếc đồng hồ! Đây là cách chúng tôi sử dụng để nói thời gian. “
  3. “SAO !? Nó luôn luôn được thay đổi!

Cũng như chúng tôi đã có các tiêu chuẩn IEEE để mô hình các số thực, chúng tôi có các tiêu chuẩn ISO-8601 để mô hình thời gian và hiển thị nó. Các mô hình ISO dựa trên các khoảng nửa mở, khoảng thời gian không mở như các số thực. Việc bắt đầu (sớm nhất) là thời điểm trong khoảng thời gian, nhưng các điểm cuối (mới nhất) thì không. Ưu điểm là bạn có thể tiếp nối hai khoảng nửa mở với nhau và có được một khoảng thời gian nửa mở thứ ba. Tương tự như vậy nếu bạn loại bỏ một khoảng thời gian nửa mở từ một khoảng thời gian nửa mở, bạn sẽ có được một hoặc hai khoảng nửa mở. Điều này ngăn cản một thực thể từ được ở hai nơi cùng một lúc.

Mặc dù thực tế là chúng ta nói về “thời gian 24 giờ” (hoặc “thời gian quân sự”), không có những điều như “24:00:00” trên đồng hồ. IBM và nhiều gói phần mềm sẽ cho phép bạn viết này, nhưng họ chuyển đổi nó để “00:00:00” của ngày hôm sau cho bạn.

Tin xấu là quy mô thời gian của chúng tôi là bất thường. Chúng tôi có một loại khác nhau của các đơn vị truyền thống có kích thước cho thời lượng. INTERVAL kiểu dữ liệu được sử dụng để đại diện cho thời gian thời gian. Họ có hai loại cơ bản. Khoảng thời gian mà đối phó với lịch và những người mà đối phó với đồng hồ. Các khoảng năm tháng có rõ ràng hay ngụ ý rằng sự chính xác bao gồm các lĩnh vực khác không có hơn một NĂM nd THÁNG, mặc dù nó không phải là cần thiết để sử dụng cả hai. Các lớp khác, được gọi là khoảng thời gian ban ngày, có một khoảng thời gian chính xác rõ ràng hay ngụ ý rằng có thể bao gồm bất kỳ lĩnh vực khác ngoài YEAR hoặc THÁNG – đó là, NGÀY, GIỜ, PHÚTSECOND (với chữ số thập phân).

Các đơn vị thời gian trong một giá trị thời gian SQL được gọi là các lĩnh vực; không nhầm lẫn điều này với các “lĩnh vực” hạn là sử dụng với hệ thống non_RDBMS file. Các trường trong khoảng thời gian có được trong cao thấp mà không để lĩnh vực thiếu. Bạn đã biết hệ thống này, kể từ khi bạn đã sử dụng tất cả của cuộc sống của bạn nó. Dưới đây là một bảng nhanh chóng của các tập hợp con của lịch Era thường được sử dụng bởi các ANSI / ISO Standard.

Cánh đồng Giới hạn giá trị Inclusive
NĂM ‘0001’ để ‘9999’; theo tiêu chuẩn ISO-8601
THÁNG ’01’ để ’12’; giá trị 12 có thể được làm tròn đến một năm
NGÀY ’01’ để ’31’; phải có giá trị trong tháng và năm
Giờ ’00’ để ’23’; giá trị 24 có thể được làm tròn đến ngày
PHÚT ’00’ để ’59’; xem cho giây nhuận!
THỨ HAI ’00’ để ’59 .999 .. ‘; chính xác được thực hiện quy định

 Chú ý rằng NĂM bắt đầu tại ‘0001’, không phải ‘0000’; điều này có lẽ có thể đủ tốt cho bất kỳ ứng dụng mà bạn đã từng viết. Nhưng nếu bạn đã từng làm việc cho một viện bảo tàng, các tiêu chuẩn / ISO ANSI có thể mở rộng phạm vi này. Nhưng bạn sẽ phải viết các thủ tục hỗ trợ của riêng bạn.

 Chúng tôi quyết định rằng chỉ hiển thị định dạng cho phép trong ANSI / ISO tiêu chuẩn SQL là “yyyy-mm-dd” , với các dấu gạch ngang. Các tháng trong năm và ngày trong tháng là trong thứ tự sắp xếp, để chuỗi dài cố định này là dễ sử dụng và ngôn ngữ độc lập. Nhiều sản phẩm có chức năng chuỗi SQL để định dạng ngày tháng trong một phương ngữ địa phương, chẳng hạn như máy chủ Sybase SQL cũ CONVERT () mà cuộc sống ngày hôm nay. Lý do cho họ là COBOL; Không, thực sự! Trong thế giới COBOL, tất cả mọi thứ là một chuỗi và tất cả các định dạng dữ liệu được thực hiện trong các ứng dụng. Hôm nay, chúng tôi sử dụng một kiến trúc tầng với lớp trình bày. Ba lĩnh vực tạo nên một NGÀY kiểu dữ liệu. Các NGÀY kiểu dữ liệu trong SQL Server là chỉ có 3 byte. Bạn có thể sử dụng cácGIỮA vị và cuối cùng điều trị ngày và thời gian được nếu họ là rời rạc.

 Bản gốc Sybase SQL Server đã được dựa vào đồng hồ phần cứng bọ ve của một máy tính PDP-11 Tháng Mười Hai, cộng với sai sót làm tròn nổi, vì vậy chúng tôi đã nhận lạ DATETIME giá trị. Chúng tôi cũng đã có vấn đề vớiDATETIME làm tròn phần thập phân để clock để gia của 0,000 , .003, hoặc 0,007 giây. Các quy định là các phân đoạn trong giây DATETIME giá trị được làm tròn đến số gia của 0,000, 0,003, 0,007 giây hoặc, như thể hiện trong bảng dưới đây.

Từ Đến Vòng để
xx: xx: xx.999 x: xx: xx.999 00: 00: 00.00
xx: xx: xx.995 xx: xx: xx.998 xx: xx: xx.997
xx: xx: xx.992 xx: xx: xx.994 xx: xx: xx.993
xx: xx: xx.990 xx: xx: xx.991 xx: xx: xx.990

Đây thực sự nổi lỗi điểm chuyển dịch thành các giá trị thời gian Chúng tôi sau đó có tất cả các loại kludges để cắt bỏ phần thời gian để có được một ngày bắt đầu từ ’00: 00: 00.000 “để sử dụng như là một ngày trong các ứng dụng. Kludge yêu thích của tôi là:

  CAST (FLOOR (CAST (test_datetime AS FLOAT)) AS DATETIME);

Thủ thuật này phụ thuộc vào thực tế rằng mô hình Sybase sử dụng một số điểm nổi với các ngày trong mantissa và thời gian trong các số mũ; nếu bạn muốn để có được ngày hôm sau, sử dụng CEILING () thay vì sàn. Tôi đã làm việc với máy tính mini đã nổi phần cứng điểm, vì vậy điều này đã được nhanh chóng và dễ dàng. Hôm nay, bạn có thể sử dụng đơn giản, di CAST (test_datetime AS NGÀY) thay thế. The Time loại dữ liệu được tạo thànhHOUR, MINUTE , và SECOND . Về mặt kỹ thuật, các đơn vị chỉ thời gian trong SI (” Système International d’đoàn kết”hay còn gọi là, hệ thống Metric) là lần thứ hai.

Đây là đúng giờ địa phương (hoặc hợp pháp) thời gian thực hiện từ một đồng hồ địa phương. Chúng tôi không có ý tưởng rằng nhận được một tín hiệu thời gian từ vệ tinh toàn cầu sẽ rất rẻ và phổ biến đủ để sử dụng trong phần cứng hàng ngày như điện thoại di động, đồng hồ đeo tay hay đồng hồ báo thức.

 Coordinated Universal Time (UTC aka “Temps Universel Coordonné”) là thời gian tiêu chuẩn mà từ đó tất cả các lần địa phương có nguồn gốc. Nó là một trong những người thừa kế có liên quan chặt chẽ đến Greenwich Mean Time (GMT), nhưng đừng lo lắng về họ, trừ khi bạn đang làm vật lý. Vâng, mọi người vẫn nói giờ, nhưng nó đã không tồn tại trong nhiều thập kỷ. Vâng, có rất nhiều người Pháp trong tên tiêu chuẩn ISO và các chữ cái đầu không phù hợp với tiếng Anh.

 Hôm nay, Standard SQL có nhiều tính năng cho lần địa phương, các múi giờ và giờ UTC. SQL Server đã được thêm vào thời gian UTC giờ địa phương, và các DATETIMEOFFSE T  kiểu dữ liệu cho các chức năng tương tự. Họ cho phép bạn xác định thời gian địa phương như offsets từ UTC, nhưng bạn phải xử lý Daylight Saving Time (DST) của riêng bạn. Có một loạt tốt các bài viết về chủ đề này của  Aaron Bertrand   bắt đầu từ: chuyển đổi Handle giữa các múi giờ trong SQL Server – phần 1

 Nhưng những gì về các kiểu dữ liệu riêng của mình? Các SECOND lĩnh vực có thể có một số chữ số thập phân cho giây phân đoạn. Tiêu chuẩn này không quy định về bao nhiêu nơi, nhưng FIPS-127 tiêu chuẩn yêu cầu ít nhất năm địa điểm và hầu hết các máy móc hiện đại sử dụng bảy bậc. Trong thế giới thực, chúng ta hiếm khi cần phải giữ cho dữ liệu nano giây, vì vậy điều này thường là tốt.

Các số thập phân chính xác để chúng tôi chơi với khoảng nửa mở. Một trong những vấn đề cổ điển là để thiết lập các khe thời gian với cái cũ DATETIME loại dữ liệu và đặt sự kiện vào chúng. Hôm nay, bạn có thể sử dụng một bảng các khe thời gian để thiết lập thêm một số thập phân thứ hai chính xác hơn so với dữ liệu của bạn. Bây giờ bạn có thể sử dụng toán học thời gian để thêm nó vào một NGÀY để TIME (1) có được một đầy đủ DATETIME2 (0) . Dưới đây là bộ xương cơ bản.

CREATE TABLE khe thời gian

(Slot_start_time TIME (1) NOT NULL PRIMARY KEY,

 slot_end_time TIME (1) NOT NULL,

 KIỂM TRA (START_TIME <END_TIME));

INSERT INTO khe thời gian –15 khoảng min

VALUES (’00: 00: 00.0 ‘, ’00: 14: 59,9 “),

(’00: 15: 00.0 ‘, ’00: 29: 59,9 “),

(’00: 30: 00.0 ‘, ’00: 44: 59,9 “),

(’00: 45: 00.0 ‘, ’01: 00: 59,9 “),

..

(’23: 45: 00.0 ‘, ’23: 59: 59,9 “);

 Dưới đây là các truy vấn cơ bản để điền vào một khe thời gian từ một DATETIME2 (0) sự kiện.

 CHỌN CAST (in_timestamp AS NGÀY), T.start_time

 TỪ khe thời gian AS T

 ĐÂU CAST (in_timestamp AS TIME (0))

 GIỮA T.slot_start_time

 VÀ T.slot_end_time;

Một vấn đề khác T-SQL cổ điển là một hạn chế để ngăn chặn một khoảng cách trong một thời gian của các sự kiện:

 CREATE TABLE Sự kiện

(Event_id CHAR (10) NOT NULL,

NGÀY previous_event_end_date NOT NULL

Chained_Dates CONSTRAINT

THAM KHẢO kiện (event_end_date),

NGÀY event_start_date NOT NULL,

event_end_date NGÀY UNIQUE, – null nghĩa là sự kiện trong tiến trình

PRIMARY KEY (event_id, event_start_date),

CONSTRAINT Event_Order_Valid

KIỂM TRA (event_start_date <= event_end_date),

Chained_Dates CONSTRAINT

KIỂM TRA (DATEADD (DAY, 1, previous_event_end_date) = event_start_date).

<< Cụ khác cho sự kiện này >>

);

– Vô hiệu hóa chế Chained_Dates

ALTER TABLE kiện nocheck Chained_Dates CONSTRAINT

– Chèn thêm một dòng khởi động

INSERT INTO kiện (event_id, previous_event_end_date, event_start_date, event_end_date)

VALUES (‘Foo Fest’, ‘2010/01/01’, ‘2010/01/02’, ‘2010-01-05’);

– Cho phép các hạn chế trong bảng

ALTER TABLE kiện KIỂM TRA Chained_Dates CONSTRAINT

– Công trình này

INSERT INTO kiện (event_id, previous_event_end_date, event_start_date, event_end_date)

VALUES (‘Glob Week’, ‘2010-01-05’, ‘2010/01/06’, ‘2010/01/10’);

– Điều này không thành

INSERT INTO kiện (event_id, previous_event_end_date, event_start_date, event_end_date)

VALUES (‘Snoob’, ‘2010/01/09’, ‘2010/01/11’, ‘2010/01/15’);

Như bạn có thể thấy, việc giữ chế về thời gian hợp lệ là không dễ dàng!

Tác giả hồ sơ: Joe Celko

Bài viết được dịch vụ bởi Thuê máy chủ VDO