PDA

View Full Version : Nhập DateTime thật quái lạ



mabu
03-05-2004, 07:38
Máy mình đã set Date theo format dd/MM/yyyy. Mở table nhập ngày theo thứ tự ngày/tháng/năm thì OK, nhưng khi viết câu Insert để nhập thì nó lại hiểu tháng/ngày/năm???. Khi truyền ngày vào câu Insert theo định dạng năm- -tháng-ngày thì lại nhận diện đúng năm-tháng-ngày. Ngô hen.

phatnq2003
04-05-2004, 01:16
Bạn có chắc là OK khi nhập trực tiếp lên máy không? (Chỉ hỏi vậy thôi).
Theo mặc nhiên, dữ liệu datetime luôn có định dạng tháng trước. Bởi vì khi INSERT, bạn phải đưa dữ liệu theo chuẩn tháng, ngày, năm.
Bạn có thể dùng theo dạng sau:
st = "INSERT INTO table (ngay) VALUES (" & Format(txtngay, "mm/dd/yyyy") & ")"
con.Execute st

handh
10-05-2004, 14:36
Đúng rồi khi đưa dữ liệu vào SQL Server Ban phải Format về dạng "mm/dd/yyyy"

TieuLongNhan
18-06-2004, 02:43
Nhưng khi mình làm theo các bạn hướng dẩn thì nó thông báo lổi "/"
Mong các bạn giải thích

phatnq2003
25-06-2004, 23:19
Để tránh sự "hiểu lầm" về ngày tháng, bạn có thể dùng hàm convert để chuyển sang dạng yyyymmdd rồi add vào table. Cái còn lại do SQL Server làm lấy: CONVERT(datetime, myDate, 112)

Trong VB có hàm Format, bạn có thể dùng hàm Format để thực hiện tương tự: FORMAT(myDate, "yyyymmdd")
:)

H2T
04-07-2004, 23:14
he he. dùng hàm convert nhiều lúc cũng chết ạc ặc ặc. Các bạn thử nghĩ nhé, ta lấy ví dụng : có một máy chạy Database (không biết kiểu ngày giời hệ thống) và một máy chạy Webserver(có thể là biết). Bạn phát một câu lệnh thao tác với dữ liệu kiểu ngày thử xem có chết không ???

copper
05-07-2004, 07:17
Máy mình đã set Date theo format dd/MM/yyyy. Mở table nhập ngày theo thứ tự ngày/tháng/năm thì OK, nhưng khi viết câu Insert để nhập thì nó lại hiểu tháng/ngày/năm???. Khi truyền ngày vào câu Insert theo định dạng năm- -tháng-ngày thì lại nhận diện đúng năm-tháng-ngày. Ngô hen.

Mình cũng luôn gặp vấn đề này với SQL server, nhất là khi bạn định lập trình với VB. Để mặc định tất cả dạng mm/dd/yyyy thì không sao, nhưng chỉ định dạng sang kiểu việt nam trong hệ thống lập tức báo lỗi và không chạy.
Nhất là những khi máy Client định dạng ngày tháng khác với máy server, ôi thì mệt quá,
Với lại sự hỗ trợ DateTime của SQL server thật chán, tớ giải quyết bằng cách sử dụng một class sử lý datetime đưa tất cả vể một định dạng và lưu dưới dạng string, và lưu trong CSDL là dạng text luôn. Mọi hoạt động vấn đúng như thường. Ôi mệt quá.

phatnq2003
12-07-2004, 02:04
Mình cũng luôn gặp vấn đề này với SQL server, nhất là khi bạn định lập trình với VB. Để mặc định tất cả dạng mm/dd/yyyy thì không sao, nhưng chỉ định dạng sang kiểu việt nam trong hệ thống lập tức báo lỗi và không chạy.
Nhất là những khi máy Client định dạng ngày tháng khác với máy server, ôi thì mệt quá,
Với lại sự hỗ trợ DateTime của SQL server thật chán, tớ giải quyết bằng cách sử dụng một class sử lý datetime đưa tất cả vể một định dạng và lưu dưới dạng string, và lưu trong CSDL là dạng text luôn. Mọi hoạt động vấn đúng như thường. Ôi mệt quá.

Tiện thể gửi lời cho bạn H2T luôn.
Định dạng ngày giờ quả thật là khá lung tung bởi người thì DMY, người thì MDY, người thì YMD (Đài loan, Nhật bản,...). Nhưng theo tôi tốt nhất để tránh nhầm lẫn là: trong tầng Applcation cứ định dạng theo thông lệ của người dùng, sau đó khi chuyển vào Database nên convert theo dạng YMD thì chắc ăn nhất. Điều này tôi đã sử dụng khá nhiều lần mà không bị trở ngại nào.

Với bạn H2T, có thể bạn có nhiều kinh nghiệm trong việc chuyển giao dữ liệu giữa 2 server khác nhau, tuy nhiên theo tôi nghĩ dù ở server nào, thì cũng theo một chuẩn thống nhất, và tất nhiên khi xử lý bạn đều biết chính xác thời gian mà bạn xử lý hoặc chuyển giao. Vậy thì làm gì có chuyện ở Webserver thì biết ngày, còn ở server database nào đó thì lại không biết!

racy
12-05-2009, 12:43
eo`
bạn giống mình quá ha cung chỉ vì nhap date time mà tó phai thi lại rút được kinh nghiệm là phải nhập thánh trước ngày mới được không thi` báo lỗi ngay
ban nhớ nhập tháng trước ngày la` ok thôi

dq_ninh
13-05-2009, 07:28
Máy mình đã set Date theo format dd/MM/yyyy. Mở table nhập ngày theo thứ tự ngày/tháng/năm thì OK, nhưng khi viết câu Insert để nhập thì nó lại hiểu tháng/ngày/năm???. Khi truyền ngày vào câu Insert theo định dạng năm- -tháng-ngày thì lại nhận diện đúng năm-tháng-ngày. Ngô hen.

Bạn cần phải set date format của SQL theo dd/MM/YYYY nữa mới được.

Tuy nhiên, kinh nghiệm..."lâm sàng" cho biết, mỗi khi nhập liệu vào CSDL, phương pháp an toàn nhất, dễ dàng nhất, giản dị nhất, là luôn luôn dùng ANSI format, chẳng hạn như YYYYMMDD. Khi nhập dữ liệu theo dạng này, không cần biết CSDL hoặc OS đã cài đặt ngày tháng năm ở mẫu nào, bạn luôn luôn có nhập liêu chính xác.

Và đó cũng là một lý do nhỏ xíu trong hàng trăm ngàn lý do tại sao ANSI là một điều vô cùng quan trọng trên nhiều lãnh vực.

Van8Hien62
13-05-2009, 18:49
Tôi thấy có gì quái lạ đâu?
Các bạn tét thử đoạn script sau:
EXEC sp_addtype N'DmY', N'smalldatetime', N'not null'
GO
create table TestYmD( stt int IDENTITY primary key, YmD DmY)
--Chỉnh hợp YmD 3 != 6
--1
SET DATEFORMAT dmy
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--4
SET DATEFORMAT mdy
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--2
SET DATEFORMAT dym
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--3
SET DATEFORMAT myd
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--5
SET DATEFORMAT ymd
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--6
SET DATEFORMAT ydm
go
INSERT TestYmD(YmD) VALUES('01/02/03')
go
--Show
select * from TestYmD

--drop table TestYmD
--sp_droptype N'DmY'

Hy vọng không phải giải thích thêm. Chúng ta hãy dùng đến chính nó để hiểu nó ( Ms Sql Sever), hoặc dùng profile để tiếp cận. It is OK?

[=========> Bổ sung bài viết <=========]

Xin lỗi, ở trên có đánh số thứ tự nhầm trong comment, và sai chính tả do bộ gõ tiếng Việt.
Văn Hiền

[=========> Bổ sung bài viết <=========]

Có những cái mà những người học và làm CT máy tính bài bản ít am tường. Thứ nhất đó là

các thiết lập môi trường. Nếu bạn không tự xét lập thì nó sẽ theo mặc định nào đó. Dùng Ms Sql Server

profile bạn nhìn thấy nó khá rõ; kế đến cũng là môi trường ở cấp hệ điều hành : Regional and

Language Options và sau nữa ở trong chính chương trình bạn viết.
//-- Ai từng làm trên Oracle, FoxPro cũ thường có thói quen thiết lập môi trường làm việc
Tôi hạn chế dùng VB vì tính chất đa nghĩa của nó :Option explicit on / off; strict on / off;

compare text / binary và việc gán trễ ( late binding ); tôi còn chưa hiểu thì compile nào hiểu được!!
Kinh nghiệm không phải là đúng, dù nó giúp chúng ta trách được sai sót đã gặp. Như kinh

nghiệm của một số bạn trao đổi ở forum này là sai. Một khi bạn nắm được thiết lập môi trường thì nhập

cái nào trước mà không được( 3 != 6 trường hợp đều tốt, cho dữ liệu đúng ).
Nói về cấu trúc dữ liệu, một data type được lưu ( thường ) cố định, việc định dạng chỉ là cái

nhìn bên ngoài theo một dạng I/O cụ thể của môi trường thôi. Dấu "." có thể là phân cách thập phân

với quốc gia này, nhưng lại là dấu phân cách ngàn ở quốc gia kia. Với dmy thì aa/bb/cc là dd/mm/yy;

còn với ymd thì aa/bb/cc lại là yy/mm/dd; Về ngày tháng năm, khi viết 01/02/03 cũng đúng; mà viết

01-02-03 cũng chẳng sai; Date separator { / - ..} bạn vào Control Panel / Regional and Language

Options thay đổi; có sai thì do môi trường, complier đó quy định, ví dụ Access là #DateTime#, MsSql là

'DateTime'
Theo tôi, để nắm tốt một ngôn ngữ là dùng chính ngôn ngữ đó. Còn dùng tới C/Dephi/VB

connect tới Sql là qua nhiều tầng chuyển rồi. Nào là DLL, nào là Lib can thiệp, chuyển đổi khác đi rồi.

Tôi sẽ nói thêm vào dịp khác.
Thân.