前一段时间,有网友问及中文日期的问题http://www.cnblogs.com/insus/articles/2012048.html,原来最终要求是需要在SQL中处理。
刚才整理了一下。把它写成一个SQL函数,需要时调用即可,下面为函数代码,仅供参考:
View Code
CREATE
FUNCTION
[
dbo
]
.
[
udf_ConvertToChineseDate
]
(
@Date DATETIME
)
RETURNS NVARCHAR ( 20 )
AS
BEGIN
-- 定义一个表变量
DECLARE @Digital TABLE ( [ D1 ] [ TINYINT ] NOT NULL , [ D2 ] [ nvarchar ] ( 2 ) NOT NULL , [ D3 ] [ nvarchar ] ( 2 ) NOT NULL )
-- 把值填充
INSERT INTO @Digital VALUES ( 0 ,N ' 〇 ' ,N ' 零 ' ),( 1 ,N ' 一 ' ,N ' 壹 ' ),( 2 ,N ' 二 ' ,N ' 贰 ' ),( 3 ,N ' 三 ' ,N ' 叁 ' ),( 4 ,N ' 四 ' ,N ' 肆 ' ),( 5 ,N ' 五 ' ,N ' 伍 ' ),
( 6 ,N ' 六 ' ,N ' 陆 ' ),( 7 ,N ' 七 ' ,N ' 柒 ' ),( 8 ,N ' 八 ' ,N ' 捌 ' ),( 9 ,N ' 九 ' ,N ' 玖 ' )
-- 处理接收的变量值转换为xxxx-xx-xx日期格式
DECLARE @string NVARCHAR ( 20 ) = CONVERT ( varchar ( 20 ), @Date , 23 )
-- 处理时一个临理变量
DECLARE @dumpString NVARCHAR ( 20 ) = ''
DECLARE @i INT = 1
-- 循环字符串
WHILE @i <= LEN ( @string )
BEGIN
DECLARE @dump NVARCHAR ( 2 ) = SUBSTRING ( @string , @i , 1 )
-- 判断是否为数字
IF ( @dump LIKE ' [0-9] ' )
BEGIN
IF ( @dump = 0 AND ( @i = 6 OR @i = 9 )) -- 如果第6位和第9位为0省略
SET @dumpString += N ''
ELSE
SET @dumpString += ( SELECT [ D2 ] FROM @Digital WHERE [ D1 ] = @dump )
END
ELSE
BEGIN
IF @i = 5
SET @dumpString += N ' 年 '
IF @i = 8
SET @dumpString += N ' 月 '
END
SET @i = @i + 1
END
RETURN @dumpString + N ' 日 '
END
(
@Date DATETIME
)
RETURNS NVARCHAR ( 20 )
AS
BEGIN
-- 定义一个表变量
DECLARE @Digital TABLE ( [ D1 ] [ TINYINT ] NOT NULL , [ D2 ] [ nvarchar ] ( 2 ) NOT NULL , [ D3 ] [ nvarchar ] ( 2 ) NOT NULL )
-- 把值填充
INSERT INTO @Digital VALUES ( 0 ,N ' 〇 ' ,N ' 零 ' ),( 1 ,N ' 一 ' ,N ' 壹 ' ),( 2 ,N ' 二 ' ,N ' 贰 ' ),( 3 ,N ' 三 ' ,N ' 叁 ' ),( 4 ,N ' 四 ' ,N ' 肆 ' ),( 5 ,N ' 五 ' ,N ' 伍 ' ),
( 6 ,N ' 六 ' ,N ' 陆 ' ),( 7 ,N ' 七 ' ,N ' 柒 ' ),( 8 ,N ' 八 ' ,N ' 捌 ' ),( 9 ,N ' 九 ' ,N ' 玖 ' )
-- 处理接收的变量值转换为xxxx-xx-xx日期格式
DECLARE @string NVARCHAR ( 20 ) = CONVERT ( varchar ( 20 ), @Date , 23 )
-- 处理时一个临理变量
DECLARE @dumpString NVARCHAR ( 20 ) = ''
DECLARE @i INT = 1
-- 循环字符串
WHILE @i <= LEN ( @string )
BEGIN
DECLARE @dump NVARCHAR ( 2 ) = SUBSTRING ( @string , @i , 1 )
-- 判断是否为数字
IF ( @dump LIKE ' [0-9] ' )
BEGIN
IF ( @dump = 0 AND ( @i = 6 OR @i = 9 )) -- 如果第6位和第9位为0省略
SET @dumpString += N ''
ELSE
SET @dumpString += ( SELECT [ D2 ] FROM @Digital WHERE [ D1 ] = @dump )
END
ELSE
BEGIN
IF @i = 5
SET @dumpString += N ' 年 '
IF @i = 8
SET @dumpString += N ' 月 '
END
SET @i = @i + 1
END
RETURN @dumpString + N ' 日 '
END
演示:
SELECT
[
dbo
]
.
[
udf_ConvertToChineseDate
]
(
CURRENT_TIMESTAMP
)
结果: