Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 19
  1. #1
    Tham gia
    03-09-2009
    Bài viết
    59
    Like
    0
    Thanked 0 Times in 0 Posts

    Insert và Update ngày giờ trong SQL

    Mình có vấn đề thế này.
    Mình tạo 1 Table trong SQL 2005 để lưu ngày và giờ của việc nhập và xuất hàng. Người dùng sẽ nhập vào ngày, giờ, phút. Ví dụ: 4 giờ 30 ngày 22 tháng 05 năm 2010. Công việc sẽ là lưu lại ngày giờ đó vào SQL.

    Mình không biết cách lưu ngày giờ đó vào SQL như nào. Nếu dùng kiểu dữ liệu là datetime thì nó sẽ lưu ngày giờ khi mình insert. Vậy trong trường hợp người dùng nhập sai, mình muốn Update lại giờ của ngày nào đó thì phải làm sao?

    Có ai biết cách làm này không ?
    Quote Quote

  2. #2
    Tham gia
    15-12-2006
    Bài viết
    28
    Like
    0
    Thanked 0 Times in 0 Posts
    Làm cột ngày riêng và giờ riêng đi bạn

  3. #3
    Tham gia
    30-10-2007
    Location
    Hà Nội
    Bài viết
    382
    Like
    0
    Thanked 14 Times in 14 Posts
    Quote Được gửi bởi Mr_Bac View Post
    Mình có vấn đề thế này.
    Mình tạo 1 Table trong SQL 2005 để lưu ngày và giờ của việc nhập và xuất hàng. Người dùng sẽ nhập vào ngày, giờ, phút. Ví dụ: 4 giờ 30 ngày 22 tháng 05 năm 2010. Công việc sẽ là lưu lại ngày giờ đó vào SQL.

    Mình không biết cách lưu ngày giờ đó vào SQL như nào. Nếu dùng kiểu dữ liệu là datetime thì nó sẽ lưu ngày giờ khi mình insert. Vậy trong trường hợp người dùng nhập sai, mình muốn Update lại giờ của ngày nào đó thì phải làm sao?

    Có ai biết cách làm này không ?
    Ai nói với bạn là dùng kiểu DateTime nó sẽ tự lưu ngày giờ khi bạn INSERT vậy?? Trong SQL kiểu DATETIME hay SMALLDATETIME thì nó cũng chỉ như các kiểu dữ liệu khác, chỉ khi nào bạn truyền giá trị cho nó thì nó mới được lưu chứ. Trừ khi bạn đặt Binding Default cho nó bằng Hàm GETDATE() hoặc GETUTCDATE() thì nó sẽ trả về giá trị kiểu DateTime là ngày giờ hiện tại.
    Để lưu kiểm DateTime thì bạn cứ tạo Table như bình thường, nếu bạn truyền vào từ .NET thì tạo một đối tựong DateTime theo giá trị người dùng nhập và truyền vào. Nếu bạn truyền từ T-SQL thì thực hiện tạo một biến kiểu DATETIME, SET giá trị cho nó theo cấu trúc 'nam-thang-ngay gio:phut:giay' ví dụ: '2010-05-22 17:02:00'

    Chúc bạn thành công!!

  4. #4
    Tham gia
    03-09-2009
    Bài viết
    59
    Like
    0
    Thanked 0 Times in 0 Posts
    Cám ơn các bạn.
    Ý mình là sau khi nhập vào thì cột ngày (kiểu dữ liệu là Datetime) trong SQL sẽ hiển thị là : ngày-tháng-năm giờ:phút:giây.
    Bây giờ mình muốn Select theo giờ và phút, hoặc Update lại giờ của ngày nào đó thì phải làm thế nào ?

    Nếu không được chắc mình phải làm cột giờ và cột phút riêng quá.
    Hơi mất thời gian chút xíu mà nhìn không hay lắm.

    Giúp mình cái nhá.

  5. #5
    Tham gia
    20-07-2009
    Location
    Hà Nội
    Bài viết
    125
    Like
    0
    Thanked 8 Times in 8 Posts
    Nếu ở SQL Server 2008 trở về sau, thì đã có kiễu dữ liệu Date và Time riêng

    Bạn quan tâm đến vấn đề gì, việc SQL lưu dữ liệu như mặc định thì có ảnh hưởng gì đến CSDL của bạn ko ?

    Còn bạn có thể select nó theo ý của mình, sao cứ nhất thiết phải lưu nó theo một định dạng khác.

    Còn việc update cả giờ thì cứ update như thường, ghi rõ cả ngày giờ mới là xong. Như bạn serivn đã nói ở trên vậy

  6. #6
    Tham gia
    01-10-2008
    Bài viết
    5
    Like
    0
    Thanked 0 Times in 0 Posts

    thử cái này xem

    mình thấy cũng đơn giản thôi mà ... quan trọng trong đối tượng .NET bạn truyền tham số để update như thế nào ! ... thí dụ mình có 1 record nhập hàng như sau :
    id ma_hang ngaygionhap
    5 K005 24/05/2010 12:37:05

    giờ bạn muốn update giờ phút của ngaygionhap ='24/05/2010 12:55'


    create procedure sp_change
    @ngaynhap datetime
    as
    begin

    update nhaphang
    set ngaygionhap=@ngaynhap
    where id =5


    trong update ở Net bạn truyền tham số kiểu string là được.
    với string đó là ngày như cũ + giờ phút lấy từ .Net . thí dụ như là

    string ngaynhap='24/05/2010'+gio+phut;
    sau đó addparamater cho store dùng lệnh update ! vẫn là mọi thao tác trong .Net !

  7. #7
    Tham gia
    27-09-2008
    Location
    http://www.encysoft.com
    Bài viết
    1,350
    Like
    11
    Thanked 14 Times in 12 Posts
    Nếu bạn muốn truyền vào cả ngày và giờ thì chọn kiểu Datetime. Smalldatetime sẽ không lưu được giờ.
    Còn format thì do mình làm. Có thể viết 1 cái function để lưu theo format như mong muốn.

  8. #8
    Tham gia
    30-10-2007
    Location
    Hà Nội
    Bài viết
    382
    Like
    0
    Thanked 14 Times in 14 Posts

    Buồn quá đi !

    Quote Được gửi bởi dinhanhency View Post
    Nếu bạn muốn truyền vào cả ngày và giờ thì chọn kiểu Datetime. Smalldatetime sẽ không lưu được giờ.
    Còn format thì do mình làm. Có thể viết 1 cái function để lưu theo format như mong muốn.
    Cái này bạn sai rồi, SMALLDATETIME hay DATETIME thì đều lưu được cả ngày và giờ, cái khác duy ở giữa DATETIME và SMALLDATETIME đó là:

    1. DATETIME dùng 2 bộ 4Byte để lưu trữ (8Byte). Lưu được giá trị nằm trong khoảng từ 1/1/1753 - 31/12/9999

    2. SMALLDATETIME dùng 2 bộ 2Byte để lưu trữ (4Byte). Lưu được giá trị từ 1/1/1900 - 6/6/2079.

    Bạn ko nên nhầm 2 cái này nhé! Còn chỉ từ version 2008 SQL Server có thêm kiểu dữ liệu DATE và TIME độc lập thì mới lưu ngày và giờ độc lập nhau.

  9. #9
    Tham gia
    03-09-2009
    Bài viết
    59
    Like
    0
    Thanked 0 Times in 0 Posts
    Cám ơn mọi người nhiều.
    Mình hiểu rồi.

    Ngày tháng mình lưu theo kiểu dữ liệu là Datetime. Vì bị vướng phần giờ + phút nên không biết Insert và Update như nào, vì mình vẫn tưởng là SQL2005có một hàm nào đó về giờ và phút, giống như hàm day, month, year cho ngày tháng vậy.

    Giờ mới biết mình lầm. Hì.

    Cứ Insert và Update như bình thường theo format của mình. Còn SQL lưu trữ thế nào thì kệ nó.

    Cám ơn mọi người nhiều ha.

    Chúc 1 ngày tốt lành.

  10. #10
    Tham gia
    30-10-2007
    Location
    Hà Nội
    Bài viết
    382
    Like
    0
    Thanked 14 Times in 14 Posts

    Thông tin

    Quote Được gửi bởi Mr_Bac View Post
    Cám ơn mọi người nhiều.
    Mình hiểu rồi.

    Ngày tháng mình lưu theo kiểu dữ liệu là Datetime. Vì bị vướng phần giờ + phút nên không biết Insert và Update như nào, vì mình vẫn tưởng là SQL2005có một hàm nào đó về giờ và phút, giống như hàm day, month, year cho ngày tháng vậy.

    Giờ mới biết mình lầm. Hì.

    Cứ Insert và Update như bình thường theo format của mình. Còn SQL lưu trữ thế nào thì kệ nó.

    Cám ơn mọi người nhiều ha.

    Chúc 1 ngày tốt lành.
    Thật ra bạn nói như vậy không chính xác, vì:

    1. Chính xác là T-SQL có các hàm xử lý với kiểu DATETIME khá mạnh, bạn có thể GOOGLE SEARCH về một số hàm như: DATEPART,DATEADD,DATEDIFF,... những hàm này thì sau khi serach nó sẽ chỉ thẳng tới trang MSDN của MS ngay nên không khó khăn gì.

    2. Không phải là mình cứ INSERT, UPDATE kiểu DATETIME theo FORMAT của mình, còn SQL lưu trữ thế nào thì kệ nó. Điều này là hoàn toàn sai, nếu ko muốn nói nhiều lúc dở khóc dở cười vì nhầm lẫn giữa Ngày với Tháng. Để lưu trữ chính xác bạn cần phải xác định:

    2.a. Nếu bạn truyền vào bằng kiểu DATETIME từ .NET hoặc từ T-SQL thì không cần lo lắng vì nó tự hiều các thành phần trong kiểu DATETIME.

    2.b. Nếu bạn truyền bằng kiểu Text (CHAR,NVARCHAR,..) thì khi thực hiện SET giá trị cho một biến kiểu DATETIME trong SQL cần chắc chắn về định dạng của chuỗi ngày tháng truyền vào. Mặc định SQL sử dụng định dạng mm/dd/yyyy trong khi người Việt chúng ta quen nhập vào với định dạng dd/mm/yyyy điều này sẽ dẫn đến sai lệch trong lưu trữ. Để khắc phục điều này bạn cần thực hiện qua một hàm CONVERT với một tham số xác đinh kiểu định dạng. Các bạn có thể hiểu qua ví dụ dưới đây:
    Code:
    --Khai báo một biến DATETIME và 1 biến kiểu VARCHAR(10)
    DECLARE @date DATETIME,
    		@value VARCHAR(10)
    
    --Giả sử giá trị truyền vào cho biến CHAR theo kiểu người Việt quen dùng
    SET @value = '12/05/2010'
    
    --Thực hiện gán giá trị cho biến kiểu DATETIME theo cách mặc định, hàm convert sẽ ngầm hiều ngày tháng định dạng kiều Mỹ (mm/dd/yyyy)
    SET @date = CONVERT(DATETIME,@value)
    SELECT @date
    
    --Khi thực hiện CONVERT ko có tham số sau khi SELECT giá trị của biến @date sẽ là
    -- 2010-12-05 00:00:00.000 => giữa tháng và ngày sẽ bị đảo lộn
    --Để khắc phục ta thêm tham số 103 cho hàm CONVERT, 103 là tham số dùng cho kiểu lưu trữ ngày tháng VN và một số nước Châu âu như Pháp, Anh
    
    SET @date = CONVERT(DATETIME,@value,103)
    SELECT @date
    
    -- Giá trị biến @date lúc này là: 2010-05-12 00:00:00.000 
    -- ==> đúng giá trị mà chúng ta muốn lưu trữ.
    Hy vọng với chú ý trên sẽ giúp bạn trong công việc của mình.
    Chúc thành công!

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •