Chuyển dữ liệu dạng text (Char or nvarchar) sang datetime

Bạn muốn chuyển đổi dữ liệu từ text (Char or nvarchar) sang datetime. Bạn có thể xem hàm sau đây. Tôi viết hàm chuyển dạng text (dd/MM/yyyy) còn các định dạng khác bạn có thể Alter hàm để dùng cho đúng mục đích.

 

--Input: char/varchar
--Output: datetime

CREATE FUNCTION dbo.ChuyenTextSangDateTime
(@mNgay nvarchar(10))  
RETURNS datetime
AS  

BEGIN 
    DECLARE @mDate   datetime
    if (len(@mNgay)>=8)--đủ ngày tháng năm
    Set @mDate=  cast(substring(@mNgay,
    CHARINDEX('/',@mNgay,0)+1,
    CHARINDEX('/',@mNgay, CHARINDEX('/',@mNgay,0)+1)
    -CHARINDEX('/',@mNgay,0)-1 )+'/'+
    substring( @mNgay,0,CHARINDEX('/',@mNgay,0))+'/'+
    substring(@mNgay, 
    CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1)+1 , 
    len(@mNgay)-CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1))
    as datetime)
    else
    if (len(@mNgay)>4 AND len(@mNgay)<8)--có tháng năm
    Set @mDate=cast(substring(@mNgay,0,CHARINDEX('/',@mNgay,0))+'/01/'+
        substring(@mNgay, CHARINDEX('/',@mNgay,0)+1, 
        len(@mNgay)-CHARINDEX('/',@mNgay,0))
               as datetime)
    else-- có năm
        Set @mDate= cast( '01/01/'+ @mNgay  as datetime)

    return @mDate
END

Bạn có thể chạy thử hàm trên như sau:

SELECT dbo.ChuyenTextSangDateTime ('22/08/2009')

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

 

Chuyển dữ liệu dạng text (Char or nvarchar) sang datetime

Bạn muốn chuyển đổi dữ liệu từ text (Char or nvarchar) sang datetime. Bạn có thể xem hàm sau đây. Tôi viết hàm chuyển dạng text (dd/MM/yyyy) còn các định dạng khác bạn có thể Alter hàm để dùng cho đúng mục đích.

 

--Input: char/varchar
--Output: datetime

CREATE FUNCTION dbo.ChuyenTextSangDateTime
(@mNgay nvarchar(10))  
RETURNS datetime
AS  

BEGIN 
    DECLARE @mDate   datetime
    if (len(@mNgay)>=8)--đủ ngày tháng năm
    Set @mDate=  cast(substring(@mNgay,
    CHARINDEX('/',@mNgay,0)+1,
    CHARINDEX('/',@mNgay, CHARINDEX('/',@mNgay,0)+1)
    -CHARINDEX('/',@mNgay,0)-1 )+'/'+
    substring( @mNgay,0,CHARINDEX('/',@mNgay,0))+'/'+
    substring(@mNgay, 
    CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1)+1 , 
    len(@mNgay)-CHARINDEX('/',@mNgay,CHARINDEX('/',@mNgay,0)+1))
    as datetime)
    else
    if (len(@mNgay)>4 AND len(@mNgay)<8)--có tháng năm
    Set @mDate=cast(substring(@mNgay,0,CHARINDEX('/',@mNgay,0))+'/01/'+
        substring(@mNgay, CHARINDEX('/',@mNgay,0)+1, 
        len(@mNgay)-CHARINDEX('/',@mNgay,0))
               as datetime)
    else-- có năm
        Set @mDate= cast( '01/01/'+ @mNgay  as datetime)

    return @mDate
END

Bạn có thể chạy thử hàm trên như sau:

SELECT dbo.ChuyenTextSangDateTime ('22/08/2009')

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

 

Chuyển đổi xâu ký tự từ TCVN3 sang Unicode C#

Trong nhiều trường hợp cần phải chuyển đổi mã từ TCVN 3 sang Unicode. Bài này giới thiệu một thuật toán đơn giản cho phép chuyển đổi một xâu ký tự từ TCVN 3 sang Unicode.  Ý tưởng của thuật toán là xây dựng hai mảng chứa các ký tự tiếng Việt có dấu cho mã TCVN 3 và Unicode. Để không phải tìm kiếm mỗi khi gặp ký tự có dấu, cần xây dựng một mảng trung gian để chuyển đổi, điều này làm giảm đáng kể thời gian chuyển đổi.

using System;
using System.Collections.Generic;
using System.Text;

class Converter {
    private static char[] tcvnchars = {
        ‘µ’, ‘¸’, ‘¶’, ‘·’, ‘¹’, 
        ‘¨’, ‘»’, ‘¾’, ‘¼’, ‘½’, ‘Æ’, 
        ‘©’, ‘Ç’, ‘Ê’, ‘È’, ‘É’, ‘Ë’, 
        ‘®’, ‘Ì’, ‘Ð’, ‘Î’, ‘Ï’, ‘Ñ’, 
        ‘ª’, ‘Ò’, ‘Õ’, ‘Ó’, ‘Ô’, ‘Ö’, 
        ‘×’, ‘Ý’, ‘Ø’, ‘Ü’, ‘Þ’, 
        ‘ß’, ‘ã’, ‘á’, ‘â’, ‘ä’, 
        ‘«’, ‘å’, ‘è’, ‘æ’, ‘ç’, ‘é’, 
        ‘¬’, ‘ê’, ‘í’, ‘ë’, ‘ì’, ‘î’, 
        ‘ï’, ‘ó’, ‘ñ’, ‘ò’, ‘ô’, 
        ‘­’, ‘õ’, ‘ø’, ‘ö’, ‘÷’, ‘ù’, 
        ‘ú’, ‘ý’, ‘û’, ‘ü’, ‘þ’, 
        ‘¡’, ‘¢’, ‘§’, ‘£’, ‘¤’, ‘¥’, ‘¦’
    };

    private static char[] unichars = {
        ‘à’, ‘á’, ‘ả’, ‘ã’, ‘ạ’, 
        ‘ă’, ‘ằ’, ‘ắ’, ‘ẳ’, ‘ẵ’, ‘ặ’, 
        ‘â’, ‘ầ’, ‘ấ’, ‘ẩ’, ‘ẫ’, ‘ậ’, 
        ‘đ’, ‘è’, ‘é’, ‘ẻ’, ‘ẽ’, ‘ẹ’, 
        ‘ê’, ‘ề’, ‘ế’, ‘ể’, ‘ễ’, ‘ệ’, 
        ‘ì’, ‘í’, ‘ỉ’, ‘ĩ’, ‘ị’, 
        ‘ò’, ‘ó’, ‘ỏ’, ‘õ’, ‘ọ’, 
        ‘ô’, ‘ồ’, ‘ố’, ‘ổ’, ‘ỗ’, ‘ộ’, 
        ‘ơ’, ‘ờ’, ‘ớ’, ‘ở’, ‘ỡ’, ‘ợ’, 
        ‘ù’, ‘ú’, ‘ủ’, ‘ũ’, ‘ụ’, 
        ‘ư’, ‘ừ’, ‘ứ’, ‘ử’, ‘ữ’, ‘ự’, 
        ‘ỳ’, ‘ý’, ‘ỷ’, ‘ỹ’, ‘ỵ’, 
        ‘Ă’, ‘Â’, ‘Đ’, ‘Ê’, ‘Ô’, ‘Ơ’, ‘Ư’
    };

    private static char[] convertTable;

    static Converter() {
        convertTable = new char[256];
        for (int i = 0; i < 256; i++)
            convertTable[i] = (char)i;
        for (int i = 0; i < tcvnchars.Length; i++)
            convertTable[tcvnchars[i]] = unichars[i];
    }

    public static string TCVN3ToUnicode(string value) {
        char[] chars = value.ToCharArray();
        for (int i = 0; i < chars.Length; i++)
            if (chars[i] < (char)256)
                chars[i] = convertTable[chars[i]];
        return new string(chars);
    }
}

Convert Font từ TCVN3 sang Unicode

Vấn đề chuyển đổi font chữ trong SQL đã được nhắc đến nhiều, và nếu bạn là lập trình viên và đã làm nhiều dự án chắc là bạn đã từng gặp vấn đề này: Chuyển font từ TCVN3 sang Unicode.

Tôi xin giới thiệu các bạn hàm convert sau:

CREATE FUNCTION dbo.funConvertToUnicode
 (@strInput VARCHAR(4000)  )
RETURNS NVARCHAR(4000) AS  
BEGIN 
    DECLARE @strOutput NVARCHAR(4000)
    DECLARE @TCVN CHAR(671)
    DECLARE @UNICODE CHAR(671)
    SET @TCVN = 
    ',184, 181, 182, 183, 185, 168, 190, 187, 188, 189, 198,
     169, 202, 199, 200, 201, 203, 208, 204, 206, 207, 209, 
     170, 213, 210, 211, 212, 214, 221, 215, 216, 220, 222,
     227, 223, 225, 226, 228, 171, 232, 229, 230, 231, 233, 
     172, 237, 234, 235, 236, 238, 243, 239, 241, 242, 244, 
     173, 248, 245, 246, 247, 249, 253, 250, 251, 252, 254, 
     174, 184, 181, 182, 183, 185, 161, 190, 187, 188, 189, 198, 
     162, 202, 199, 200, 201, 203, 208, 204, 206, 207, 209, 163, 
     213, 210, 211, 212, 214, 221, 215, 216, 220, 222, 227, 223, 
     225, 226, 228, 164, 232, 229, 230, 231, 233, 165, 237, 234, 
     235, 236, 238, 243, 239, 241, 242, 244, 166, 248, 245, 246, 
     247, 249, 253, 250, 251, 252, 254, 167, '

    SET @UNICODE = 
    ',225, 224, 7843,227, 7841,259, 7855,7857,7859,7861,7863,
    226, 7845,7847,7849,7851,7853,233, 232, 7867,7869,7865,234, 
    7871,7873,7875,7877,7879,237, 236, 7881,297, 7883,243, 242, 
    7887,245, 7885,244, 7889,7891,7893,7895,7897,417, 7899,7901,
    7903,7905,7907,250, 249, 7911,361, 7909,432, 7913,7915,7917,
    7919,7921,253, 7923,7927,7929,7925,273, 193, 192, 7842,195, 
    7840,258, 7854,7856,7858,7860,7862,194, 7844,7846,7848,7850,
    7852,201, 200, 7866,7868,7864,202, 7870,7872,7874,7876,7878,
    205, 204, 7880,296, 7882,211, 210, 7886,213, 7884,212, 7888,
    7890,7892,7894,7896,416, 7898,7900,7902,7904,7906,218, 217, 
    7910,360, 7908,431, 7912,7914,7916,7918,7920,221, 7922,
    7926,7928,7924,272, '

    IF @strInput IS NULL RETURN ''
    IF @strInput = '' RETURN ''
    DECLARE @COUNTER INT
    DECLARE @POSITION INT
    SET @COUNTER = 1
    SET @strOutput = ''
    WHILE (@COUNTER <= LEN(@strInput))
    BEGIN
    SET @POSITION = CHARINDEX(','+CONVERT(CHAR(4),
        ASCII(SUBSTRING(@strInput, @COUNTER, 1)))+',', @TCVN, 1)
    IF @POSITION > 0
    SET @strOutput = @strOutput + 
        NCHAR(CONVERT(INT,SUBSTRING(@UNICODE, @POSITION+1, 4)))
    ELSE
    SET @strOutput = @strOutput + SUBSTRING(@strInput, @COUNTER, 1)
    SET @COUNTER = @COUNTER + 1
    END
    RETURN @strOutput 
END
Chú ý để hàm chạy đúng bạn cần để
SET @TCVN = ',184, 181, 182,...'


SET @UNICODE = ',225, 224, 7843,...'

Mỗi biến trên cùng 1 dòng code. Ở đây mình không trình bày được như vậy vì nếu để trên cùng dòng sẽ quá độ rộng của trình duyệt

Để chạy thử hàm trên bạn mở notepad, chọn font (Unikey) là TCVN3 và gõ vào chuỗi bất kỳ.

Vì dụ:
SELECT [dbo].[fuConvertToUnicode] ('Céng hßa x· héi chñ nghÜa ViÖt Nam')
 --> Cộng hòa xã hội chủ nghĩa Việt Nam

Tính số ngày trong tháng

Khi lập trình với cơ sở dữ liệu, có thể bạn sẽ cần tính số ngày của tháng để thực hiện mục đích nào đó (Tính số liệu trung bình theo tháng chằng hạn). Tôi xin sẽ giới thiệu với bạn hàm được viết trong SQL

Bạn mở SQL Query viết hàm như sau:
Hàm trả về kiểu Int
Input: Tháng, Năm
Output: Số ngày của tháng

 

CREATE  FUNCTION dbo.funDaysInMonth (
@Thang  Int,
@Nam    Int
)  
RETURNS int
AS  
BEGIN   

DECLARE @mNgay  Int

IF @Thang = 2 
    BEGIN
        IF((@Nam % 4 = 0 AND @Nam %100<>0)OR(@Nam % 400 = 0))
            SET @mNgay = 29
        ELSE
            SET @mNgay = 28
    END
ELSE
    SELECT @mNgay =  
        CASE @Thang
            WHEN 1 THEN 31
            WHEN 3 THEN 31
            WHEN 5 THEN 31
            WHEN 7 THEN 31
            WHEN 8 THEN 31
            WHEN 10 THEN 31
            WHEN 12 THEN 31
            WHEN 4 THEN 30
            WHEN 6 THEN 30
            WHEN 9 THEN 30
            WHEN 11 THEN 30
        END

RETURN @mNgay
END

Bạn có thể kiểm tra bằng lệnh sau:

Select dbo.funDaysInMonth (2,2004) --29
Select dbo.funDaysInMonth (2,2005) --28



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