Giới thiệu về cơ sở dữ liệu ngày thập tự chinh của tôi: Hợp lệ? Đáng giá? Có ai khác cảm thấy nó?


13

Tôi dành nhiều thời gian để trả lời các câu hỏi SQL trên SO. Tôi thường xuyên bắt gặp các truy vấn của ilk này:

SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'

SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'

SELECT * FROM person WHERE birthdate BETWEEN 'some string' AND 'other string'

tức là dựa vào chuyển đổi ngầm định từ chuỗi sang ngày (xấu), của các tham số đã cho hoặc dựa vào cơ sở dữ liệu chuyển đổi x triệu giá trị hàng cơ sở dữ liệu thành chuỗi và thực hiện so sánh chuỗi (tệ hơn)

Thỉnh thoảng tôi đưa ra nhận xét, đặc biệt nếu đó là người dùng đại diện cao, người viết câu trả lời thông minh, nhưng người mà tôi cảm thấy thực sự nên bớt cẩu thả / xâu chuỗi với kiểu dữ liệu của họ

Nhận xét thường có dạng sẽ tốt hơn nếu họ chuyển đổi rõ ràng chuỗi của họ thành ngày, sử dụng to_date (Oracle), str_to_date (MySQL), convert (SQLSERVER) hoặc một số cơ chế tương tự:

    --oracle
    SELECT * FROM person WHERE birthdate BETWEEN TO_DATE('20170101', 'YYYYMMDD') AND TO_DATE('20170301', 'YYYYMMDD')

    --mysql
    SELECT * FROM person WHERE birthdate BETWEEN STR_TO_DATE('20170101', '%Y%m%d') AND STR_TO_DATE('20170301', '%Y%m%d')

    --SQLS, ugh; magic numbers
    SELECT * FROM person WHERE birthdate BETWEEN CONVERT(datetime, '20170101', 112) AND CONVERT(datetime, '20170301', 112)

Các biện minh kỹ thuật của tôi để làm như vậy là nó rõ ràng về định dạng của ngày và đảm bảo rằng một vài tham số nguồn chắc chắn trở thành kiểu dữ liệu của cột mục tiêu. Điều này ngăn bất kỳ khả năng nào cơ sở dữ liệu sẽ nhận được một chuyển đổi ngầm định (đối số thứ 3/1 tháng 3 của ví dụ đầu tiên) và nó ngăn db quyết định chuyển đổi một triệu giá trị ngày trong bảng thành chuỗi (sử dụng một số ngày cụ thể của máy chủ định dạng thậm chí có thể không khớp với định dạng của ngày trong các tham số chuỗi trong sql) để thực hiện so sánh - rất nhiều điều kinh khủng

Sự biện minh xã hội / học thuật của tôi để làm như vậy là SO là một trang web học tập; những người trên đó tiếp thu kiến ​​thức hoặc ngầm hoặc rõ ràng. Để đánh một người mới với truy vấn này như một câu trả lời:

SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'

Có thể khiến họ nghĩ rằng điều này là hợp lý, điều chỉnh ngày cho một số định dạng họ thích:

SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'

Nếu ít nhất họ thấy một số nỗ lực rõ ràng để chuyển đổi ngày, họ có thể bắt đầu thực hiện nó cho định dạng ngày kỳ lạ của mình và tiêu diệt một số lỗi mãi mãi trước khi chúng phát sinh. Rốt cuộc, chúng tôi (tôi) cố gắng ngăn cản mọi người tập thói quen tiêm SQL (và có ai ủng hộ việc tham số hóa truy vấn và sau đó khai báo cho trình điều khiển đó @pBirthdatelà một chuỗi, khi giao diện có kiểu thời gian không?)

Quay lại những gì xảy ra sau khi tôi đưa ra khuyến nghị: Tôi thường nhận được một số phản hồi cho đề xuất "rõ ràng, sử dụng x", như "mọi người khác làm điều đó", "nó luôn hoạt động với tôi", "hiển thị cho tôi một số tài liệu tham khảo hoặc tài liệu tham khảo điều đó nói rằng tôi nên rõ ràng "hoặc thậm chí" những gì ?? "

Tôi đã hỏi, để trả lời một số trong số này, liệu họ có tìm kiếm một cột int hay không bằng cách WHERE age = '99'vượt qua tuổi như một chuỗi. "Đừng ngớ ngẩn, chúng ta không cần phải đặt 'khi tìm kiếm int", vì vậy có một sự đánh giá cao cho các loại dữ liệu khác nhau trong tâm trí của họ ở đâu đó, nhưng có lẽ không có kết nối nào với bước nhảy vọt logic khi tìm kiếm một int cột bằng cách chuyển một chuỗi (có vẻ ngớ ngẩn) và tìm kiếm cột ngày bằng cách chuyển một chuỗi (có vẻ hợp lý) là đạo đức giả

Vì vậy, trong các SQL của chúng ta, chúng ta có một cách để viết các thứ dưới dạng số (sử dụng số, không có dấu phân cách), mọi thứ dưới dạng chuỗi chuỗi (sử dụng bất cứ thứ gì giữa các dấu phân cách dấu nháy đơn) .. Tại sao không có dấu phân cách cho ngày? Đó là một kiểu dữ liệu cơ bản trong hầu hết DB? Có thể giải quyết toàn bộ vấn đề này chỉ bằng cách viết một ngày theo cùng một cách javascript cho phép chúng tôi chỉ định một biểu thức chính bằng cách đặt /một trong hai bên của một số ký tự. /Hello\s+world/. Tại sao không có một cái gì đó cho ngày?

Trên thực tế, theo hiểu biết của tôi, (chỉ) Microsoft Access thực sự có các ký hiệu cho biết "một ngày đã được viết giữa các dấu phân cách này" để chúng tôi có thể có một lối tắt tốt như WHERE datecolumn = #somedate#nhưng trình bày ngày vẫn có thể đưa ra các vấn đề, ví dụ như mm / di vs dd / mm, bởi vì MS luôn chơi nhanh và lỏng lẻo với những thứ mà đám đông VB nghĩ là một ý tưởng tốt


Quay lại điểm chính: Tôi cho rằng thật khôn ngoan khi nói rõ với phương tiện này buộc chúng ta phải vượt qua vô số kiểu dữ liệu khác nhau dưới dạng chuỗi ..

Đó có phải là một khẳng định hợp lệ?

Tôi có nên tiếp tục cuộc thập tự chinh này? Đây có phải là một điểm hợp lệ mà việc gõ chuỗi là không hiện đại? Hoặc mọi RDBMS (bao gồm cả các phiên bản cổ đại) ngoài kia, khi đẩy một truy vấn WHERE datecolumn = 'string value'hoàn toàn chắc chắn chuyển đổi chính xác chuỗi thành một ngày và thực hiện tìm kiếm mà không chuyển đổi dữ liệu bảng / mất sử dụng chỉ mục? Tôi nghi ngờ là không, ít nhất là từ kinh nghiệm cá nhân của Oracle 9. Tôi cũng nghi ngờ rằng có thể có một số tình huống xảy ra nếu các chuỗi luôn được viết theo định dạng tiêu chuẩn ISO và cột là một số hương vị ngày, sau đó tham số chuỗi sẽ luôn được chuyển đổi hoàn toàn chính xác. Điều này làm cho nó đúng?

Nó có phải là một nhiệm vụ đáng giá?

Nhiều người dường như không hiểu nó, hoặc không quan tâm, hoặc thể hiện một số giả thuyết ở chỗ ints của họ là ints nhưng ngày của họ là chuỗi .. Thông thường, hầu hết mọi người đều quay lại và nói "bạn biết không những gì, tôi đồng ý với quan điểm của bạn. Tôi sẽ nói rõ về ngày của tôi kể từ bây giờ ".


Tôi thậm chí đã thấy ai đó gặp vấn đề với WHERE datecolumn = 01/02/12, nơi có thể họ đang yêu cầu cho năm 1912, 2012, 2001, 1901, 12 hoặc 1. Đây cũng là một vấn đề bên ngoài thế giới cơ sở dữ liệu, con số trong số các lập trình viên không thể hiểu tại sao chuyển đổi "09"sang int gây ra sự cố là quân đoàn, 9 không phải là chữ số bát phân hợp lệ và số 0 đứng đầu tạo ra chuỗi bát phân trong rất nhiều hệ thống
Steve Barnes

2
Tôi đã nghĩ đến việc mở rộng ví dụ của mình để hỏi liệu có phải WHERE age = '0x0F'là một cách hợp lệ để hy vọng cơ sở dữ liệu sẽ tìm kiếm những đứa trẻ mười lăm tuổi không ..
Caius Jard

1
Tôi đã xóa một câu hỏi không có chủ đề ở đây - chúng tôi không thực hiện các yêu cầu tài nguyên. Một trong 2 phiếu gần đã được đưa ra vì lý do này. Mặt khác, tôi nghĩ rằng đây là một câu hỏi hợp lệ, mặc dù nó có thể quá rộng. Tôi hy vọng rằng việc loại bỏ các câu hỏi ngoài chủ đề sẽ giúp thu hẹp mọi thứ một chút.
Thomas Owens

TL; DR nhưng trong các hệ thống sản xuất, tôi mong đợi những ngày như thế này hầu như luôn luôn nằm trong các tham số. Ngày mã hóa vào các truy vấn là một vấn đề lớn hơn so với việc bạn có sử dụng chuyển đổi ngầm định hay không. Nếu tôi đang viết một số truy vấn vứt đi, nó sẽ hoạt động hoặc không. Tôi không bao giờ làm điều này dù thế nào (vì tôi không bao giờ có thể nhớ định dạng ngày mặc định) nhưng tôi không chắc nó quan trọng lắm.
JimmyJames

1
Cuộc sống là chọn những trận đánh của bạn. Theo quan điểm của tôi, thứ này không đáng để đánh nhau ...
Robbie Dee

Câu trả lời:


7

Bạn đã viết:

là những thông số từ ngày 1 tháng 1 đến ngày 3 tháng 1 hoặc ngày 1 tháng 3 ..

Đó thực sự là một nguồn tiềm năng của lỗi. Chỉ ra điều này cho người hỏi có thể hữu ích cho những người đọc khác, vì vậy, đây là một mối quan tâm hợp lệ. Tuy nhiên, để mang tính xây dựng, tôi sẽ

  • tham khảo SQL ANSI và sử dụng các ký tự DATE hoặc DATETIME từ tiêu chuẩn đó

  • sử dụng định dạng ngày giờ thông thường, rõ ràng của một DBMS cụ thể (và đề cập đến phương ngữ SQL nào được sử dụng)

Thật không may, không phải mọi DBMS đều hỗ trợ chữ theo ngày ANSI SQL theo cách tương tự chính xác (nếu chúng hoàn toàn hỗ trợ nó), vì vậy điều này thường sẽ dẫn đến một biến thể của cách tiếp cận thứ hai. Việc "tiêu chuẩn" không được các nhà cung cấp DB khác nhau thực hiện một cách cứng nhắc có lẽ là một phần của vấn đề ở đây.

Lưu ý thêm, đối với nhiều hệ thống trong thế giới thực, mọi người thực sự có thể dựa vào một ngôn ngữ cố định, cụ thể trên máy chủ cơ sở dữ liệu, ngay cả khi các ứng dụng khách được bản địa hóa, bởi vì chỉ có một loại máy chủ, luôn được cấu hình theo cùng một cách. Vì vậy, '01 / 03/2017 'thường có thể được coi là có định dạng cố định' dd / mm / yyyy 'hoặc' mm / dd / yyyy 'cho bất kỳ SQL nào được sử dụng trên hệ thống cụ thể mà họ đang làm việc. Vì vậy, nếu ai đó nói với bạn "nó luôn làm việc cho tôi", đây thực sự có thể là một câu trả lời hợp lý cho môi trường của anh ấy . Nếu đây là trường hợp, nó làm cho nó ít đáng để thảo luận về chủ đề này.

Nói về "lý do hiệu suất": miễn là không có vấn đề về hiệu suất có thể đo lường được, điều này khá là mê tín khi tranh luận với "các vấn đề hiệu suất tiềm năng". Nếu một cơ sở dữ liệu đang thực hiện một triệu chuyển đổi theo chuỗi hoặc có thể không quan trọng khi chênh lệch thời gian chỉ là 1/1000 giây và nút cổ chai thực sự là mạng khiến truy vấn kéo dài 10 giây. Vì vậy, tốt hơn nên đặt những mối quan tâm này sang một bên miễn là ai đó hỏi rõ ràng để xem xét hiệu suất.

Tôi có nên tiếp tục cuộc thập tự chinh này?

Tôi nói với bạn một bí mật: Tôi ghét các cuộc chiến tôn giáo. Chúng không dẫn đến bất cứ điều gì hữu ích. Vì vậy, nếu thông số ngày / thời gian không rõ ràng trong SQL có thể dẫn đến các vấn đề, hãy đề cập đến chúng, nhưng đừng cố ép mọi người cứng nhắc hơn nếu nó không thực sự mang lại cho họ bất kỳ lợi ích nào trong bối cảnh hiện tại của họ.


Đây không phải là quá nhiều câu hỏi về sự mơ hồ của các định dạng ngày của Mỹ và Sensible. Đó là về việc liệu có thể vượt qua ngày trong một câu lệnh SQL dưới dạng chuỗi hay không và dựa vào chuyển đổi ngầm định thành ngày. Câu hỏi về cơ sở dữ liệu phải thực hiện một triệu ngày -> chuyển đổi str cho tất cả triệu hàng là một khía cạnh hiệu suất và có thể chỉ mất 1/1000 giây cho một truy vấn, nhưng bây giờ hãy tưởng tượng nó trong bối cảnh có rất nhiều đồng thời người dùng. Vấn đề hiệu suất lớn hơn là việc chuyển đổi dữ liệu có nghĩa là các chỉ mục không còn có thể được sử dụng và điều đó có thể thực sự nghiêm trọng
Caius Jard

@CaiusJard: câu trả lời của tôi là: đôi khi hợp lý, và đôi khi không, nó phụ thuộc vào bối cảnh. Và thành thật mà nói, tôi từ chối "... tưởng tượng ..." bất cứ điều gì ở đây. Khi nói đến hiệu suất, thảo luận về bất kỳ trường hợp giả định nào là không hữu ích. Khi có các vấn đề hiệu suất có thể đo lường được, đó là lúc để tối ưu hóa, và đôi khi để tối ưu hóa vi mô, không phải trước đó.
Doc Brown

Thật thú vị khi bạn xem nó là giả thuyết; Tôi thấy việc dựa vào hành vi ngầm là cơ hội rõ ràng cho các lỗi và biến chứng hiệu suất phát sinh (vì lý do được ghi chép rõ ràng: các chỉ mục không hoạt động nếu toàn bộ dữ liệu cột được chuyển đổi trước khi được tìm kiếm) và với các hướng dẫn rõ ràng những điều này không thể xảy ra
Caius Jard

@CaiusJard: không chơi chữ - với "giả thuyết" Tôi không có nghĩa là "không thể", tôi đã sử dụng thuật ngữ cho bất kỳ loại kịch bản tưởng tượng nào, trái ngược với "tình huống thực tế hiện tại" nơi người ta có thể đo lường những gì xảy ra.
Doc Brown

1
@CaiusJard: nếu bạn muốn gây ấn tượng với các chuyên gia khác trong ngành, bạn nên biết chính xác lý do tại sao "tối ưu hóa hiệu suất" rất khác với "tối ưu hóa bảo mật" và đó chính xác là vấn đề của tôi ở đây - vấn đề hiệu suất có thể được xử lý sau khi chúng xảy ra, điều đó hiếm khi xảy ra quá muộn. Vấn đề bảo mật không, chúng nên được tránh triệt để trước khi chúng xảy ra. Vì vậy, đừng so sánh táo với cam. Nếu bạn thích các cuộc thập tự chinh, các đối số bảo mật phù hợp hơn nhiều cho việc này ;-)
Doc Brown

5

Cuộc thập tự chinh của bạn không giải quyết được vấn đề.

Có hai vấn đề riêng biệt:

  • chuyển đổi kiểu ngầm định trong SQL

  • định dạng ngày mơ hồ như 05/06/07

Tôi thấy bạn đến từ đâu với cuộc thập tự chinh của bạn, nhưng tôi không nghĩ việc chuyển đổi rõ ràng thực sự giải quyết được vấn đề trong tay:

  • Chuyển đổi ngầm định vẫn xảy ra trong trường hợp không khớp giữa các loại trong một so sánh. Nếu một chuỗi được so sánh với một ngày, SQL sẽ cố gắng chuyển đổi chuỗi thành một ngày đầu tiên. Vì vậy, so sánh cột loại ngày với giá trị ngày được chuyển đổi rõ ràng hoàn toàn giống với so sánh với ngày ở định dạng chuỗi. Sự khác biệt duy nhất tôi thấy là nếu bạn so sánh giá trị ngày với một cột không thực sự chứa ngày nhưng chuỗi - nhưng đây sẽ là một lỗi trong mọi trường hợp.

  • Sử dụng chuyển đổi rõ ràng không giải quyết được sự mơ hồ trong các định dạng ngày không phải ISO.

Giải pháp duy nhất tôi thấy:

  • không so sánh các cột kiểu chuỗi với các giá trị không phải chuỗi.
  • chỉ bao giờ sử dụng định dạng ngày loại ISO.

Và tất nhiên, đừng bao giờ lưu trữ ngày trong một cột kiểu chuỗi. Nhưng một lần nữa, chuyển đổi rõ ràng của chữ ngày sẽ không ngăn chặn điều này.

Có thể cho rằng, chuyển đổi ngầm là một lỗi trong SQL, nhưng được đưa ra cách ngôn ngữ được thiết kế, tôi không thấy lợi ích của việc chuyển đổi rõ ràng. Dù sao nó cũng không tránh được chuyển đổi ngầm định và nó chỉ làm cho mã khó đọc và viết hơn.


Thật. Có lẽ tôi nên chỉ ra từ quan điểm này, rằng điều hợp lý nhất để làm là đảm bảo rằng toán hạng dữ liệu và toán hạng giá trị có cùng kiểu dữ liệu (có thể là chuỗi, ngày, bất cứ điều gì). Tôi đặc biệt đưa ra khuyến nghị này chỉ trong các câu hỏi mà tôi biết cột bảng là DATETIME và câu trả lời mẫu của họ là sử dụng toán hạng chuỗi với chuyển đổi ngầm ..
Caius Jard

Một cái gì đó không phù hợp với tôi về câu trả lời này. Bạn đưa ra một số điểm thú vị nhưng tôi cảm thấy như kết luận là duy tâm. Từ góc độ thiết kế, vâng, các định dạng ngày không phải ISO không rõ ràng đối với mắt người nhưng nếu sử dụng chuyển đổi rõ ràng, về mặt cú pháp thì nó không mơ hồ đối với trình phân tích cú pháp. Tương tự, nhiều quy trình ETL liên quan đến ngày sẽ yêu cầu một số so sánh (dưới dạng nhập tệp) của một chuỗi với định dạng ngày của cơ sở dữ liệu. Cố gắng loại bỏ chuỗi để so sánh ngày dường như không thực tế với tôi.
DanK

@DanK: ETL là một vấn đề khác - nếu bạn đang đọc dữ liệu từ tệp CSV hoặc một cái gì đó, rõ ràng bạn phải xử lý dữ liệu dưới dạng chuỗi và phân tích rõ ràng thành các giá trị được nhập. Nhưng đó không phải là kịch bản mà OP đang mô tả.
JacquesB

Nó có thể dễ dàng là điểm tôi đang mô tả mặc dù; không có gì đặc biệt về một chuỗi số được lưu trữ trong một csv yêu cầu khai báo rõ ràng định dạng khi phân tích cú pháp và nó có liên quan đến đối số mà tôi đưa ra nếu một người mới đọc một số câu trả lời trong SO nơi pro không thực hiện bất kỳ nỗ lực nào để rõ ràng khai báo định dạng ngày, dẫn đến người mới giả định rằng họ không cần phải lo lắng về điều đó (hoặc db sẽ phân tích chính xác mọi lúc)
Caius Jard

@CaiusJard: Tôi tin rằng đây là những kịch bản rất khác nhau. Khi nói về SQL trong các kịch bản thông thường, tôi giả sử các cột có các loại thích hợp - tức là các cột số nguyên là kiểu số nguyên, cột ngày là kiểu dữ liệu, v.v. Nếu bạn không có các loại chính xác trong các bảng (ví dụ: lưu trữ ngày dưới dạng chuỗi), bạn sẽ gặp rắc rối lớn và việc chuyển đổi rõ ràng các ngày theo nghĩa đen trong các truy vấn sẽ không cứu bạn , đó là quan điểm của tôi.
JacquesB

3

Đầu tiên và quan trọng nhất, bạn có một điểm. Ngày không nên được đưa vào chuỗi. Các công cụ cơ sở dữ liệu là những con thú phức tạp trong đó bạn không bao giờ chắc chắn 100% chính xác những gì sẽ xảy ra dưới mui xe được cung cấp một truy vấn tùy ý. Chuyển đổi sang ngày làm cho mọi thứ rõ ràng và có thể tăng hiệu suất.

NHƯNG

Đó không phải là một vấn đề đáng để nỗ lực suy nghĩ thêm để giải quyết cho hầu hết mọi người. Nếu thật dễ dàng để sử dụng chữ theo ngày trong một truy vấn, nó sẽ dễ dàng bảo vệ vị trí của bạn. Nhưng nó không phải là. Tôi chủ yếu sử dụng SQL Server, vì vậy cố gắng nhớ mớ hỗn độn đó để chuyển đổi một ngày không xảy ra.

Đối với hầu hết mọi người, hiệu suất đạt được là không đáng kể. "Tại sao đúng vậy thưa ông chủ, tôi đã dành thêm 10 phút để sửa lỗi đơn giản này (tôi phải google cách chuyển đổi ngày vì cú pháp đó là ... đặc biệt ...). Nhưng tôi đã tiết kiệm thêm 0,00001 giây một truy vấn hiếm khi được thực hiện. " Điều đó sẽ không bay đến hầu hết những nơi tôi từng làm việc.

Nhưng nó loại bỏ sự mơ hồ trong các định dạng ngày bạn nói. Một lần nữa, đối với rất nhiều ứng dụng (ứng dụng nội bộ của công ty, nội dung của chính quyền địa phương, v.v.) nó không thực sự là một mối quan tâm. Và đối với những ứng dụng mà nó là mối quan tâm (ứng dụng lớn, quốc tế hoặc doanh nghiệp), sẽ trở thành mối quan tâm của lớp UI / doanh nghiệp hoặc những công ty đó đã có một nhóm các DBA thành thạo đã biết điều này. TL / DR: nếu quốc tế hóa là một mối quan tâm, ai đó đã suy nghĩ về nó và đã thực hiện như bạn đề xuất (hoặc đã giảm nhẹ vấn đề).

Giờ thì sao?

Nếu bạn cảm thấy rất nghiêng, hãy tiếp tục chiến đấu tốt. Nhưng đừng ngạc nhiên nếu hầu hết mọi người không cảm thấy điều này đủ quan trọng để lo lắng. Chỉ vì có những tình huống quan trọng, không có nghĩa đó là tình huống của mọi người (và có khả năng là không). Vì vậy, đừng ngạc nhiên khi bạn nhận được một số phản hồi cho một cái gì đó đúng về mặt kỹ thuật và tốt hơn nhưng không thực sự phù hợp.


1

Tôi cho rằng thật khôn ngoan khi nói rõ ràng với phương tiện này buộc chúng ta phải vượt qua vô số kiểu dữ liệu khác nhau dưới dạng chuỗi.

Giả sử rằng "ngày" đang được thông qua "trong" Chuỗi thì có; Tôi hoàn toàn đồng ý rằng bạn có quyền làm điều này.

Khi nào "01/04/07"?
* Ngày 4 tháng 1?
* Ngày 1 tháng Tư?
* Ngày 7 tháng 4 [2001]?

Bất kỳ hoặc tất cả những điều này thể đúng, tùy thuộc vào cách "máy tính" chọn giải thích chúng.

Nếu bạn phải xây dựng SQL động có chữ, thì định dạng ngày của bạn phải được xác định rõ và tốt nhất là độc lập với máy (Tôi có một lỗi lạ trên Windows Server khi xử lý dựa trên ngày trong Dịch vụ Windows không ổn định bởi vì một nhà điều hành đăng nhập vào bảng điều khiển với các tùy chọn định dạng ngày khác nhau!). Cá nhân, tôi độc quyền sử dụng [d] định dạng "yyyy-mm-dd".

Tuy nhiên ...

Các tốt nhất giải pháp là sử dụng parameterised truy vấn mà buộc các kiểu dữ liệu được chuyển đổi trước khi SQL được tham gia - nhận được một "ngày" giá trị vào một ngày lực lượng Parameter việc chuyển đổi loại hình từ rất sớm (làm cho nó hoàn toàn là một vấn đề mã hóa, không phải là một SQL) .


Tôi đồng ý, mặc dù vấn đề tương tự có thể được buộc lại với các truy vấn được tham số hóa, bằng cách thực hiện WHERE datecolumn = @dateParametervà sau đó trong mã giao diện người dùng, nói với trình điều khiển DB @dateParameterlà kiểu varchar và dính "01/04/07"vào nó. Cảm hứng ban đầu cho câu hỏi của tôi là tôi nghi ngờ bất kỳ ai sẽ nói với tôi rằng tôi điên khi làm điều đó với một truy vấn được tham số hóa, sau đó, trong cùng một hơi thở, sẽ đưa ra một câu trả lời SO giống như WHERE datecol = 'some string that looks like a date'(và mong đợi một người mới nên biết đó chỉ là một gợi ý / tham số hóa nó để tránh các vấn đề)
Caius Jard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.