蛋疼的时候写了一个蛋疼的函数

黄_瓜 2012-03-26 03:33:54
加精
-- =============================================
-- Author: 小爱
-- Create date: 2012-03-26
-- Description: 以不同的格式显示日期/时间数据
-- @date: 合法的日期
-- @format: 规定日期/时间的输出格式
-- =============================================

IF OBJECT_ID('formatDate','FN') IS NOT NULL DROP FUNCTION [formatDate]
GO

CREATE FUNCTION [dbo].[formatDate](@date AS datetime, @format varchar(50))
RETURNS varchar(50)
AS
BEGIN
DECLARE @string varchar(50)
-- ================================================
-- 填充日期/时间的输出格式
-- ================================================
;WITH allowedTokens (id, code, value) AS (
SELECT id,
code COLLATE Latin1_General_CS_AS,
value
FROM (
SELECT 1, 'YYYY', RIGHT('0000' + CAST(YEAR(@date) AS varchar(4)),4)
UNION ALL SELECT 2, 'YY', RIGHT('00' + CAST(YEAR(@date) AS varchar(4)),2)
UNION ALL SELECT 3, 'Y', CAST(CAST(RIGHT('00' + CAST(YEAR(@date) AS varchar(4)),2) AS int) AS varchar(2))
UNION ALL SELECT 4, 'MM', RIGHT('00' + CAST(MONTH(@date) AS varchar(2)),2)
UNION ALL SELECT 5, 'M', CAST(MONTH(@date) AS varchar(2))
UNION ALL SELECT 6, 'DD', RIGHT('00' + CAST(DAY(@date) AS varchar(2)),2)
UNION ALL SELECT 7, 'D', CAST(DAY(@date) AS varchar(2))
UNION ALL SELECT 8, 'HH', RIGHT('00' + CAST(DATEPART(hour,@date) AS varchar(2)),2)
UNION ALL SELECT 9, 'H', CAST(DATEPART(hour,@date) AS varchar(2))
UNION ALL SELECT 10, 'hh', RIGHT('00' + CAST(DATEPART(hour, @date) - (12 * CEILING((DATEPART(hour, @date) - 12)*.1)) AS varchar(2)),2)
UNION ALL SELECT 11, 'h', CAST(DATEPART(hour, @date) - (12 * CEILING((DATEPART(hour, @date) - 12)*.1)) AS varchar(2))
UNION ALL SELECT 12, 'mm', RIGHT('00' + CAST(DATEPART(minute,@date) AS varchar(2)),2)
UNION ALL SELECT 13, 'm', CAST(DATEPART(minute,@date) AS varchar(2))
UNION ALL SELECT 14, 'ss', RIGHT('00' + CAST(DATEPART(second,@date) AS varchar(2)),2)
UNION ALL SELECT 15, 's', CAST(DATEPART(second,@date) AS varchar(2))
UNION ALL SELECT 16, 'fff', RIGHT('000' + CAST(DATEPART(millisecond,@date) AS varchar(3)),3)
UNION ALL SELECT 17, 'f', CAST(DATEPART(millisecond,@date) AS varchar(3))
UNION ALL SELECT 18, 'tt', CASE WHEN DATEPART(hour,@date) >= 12 THEN 'PM' ELSE 'AM' END
UNION ALL SELECT 19, 't', CASE WHEN DATEPART(hour,@date) >= 12 THEN 'P' ELSE 'A' END
) AS susbst (id, code, value)
),
-- ================================================
-- 对列表进行格式化处理
-- ================================================
substitutions (id, code, value, maxval) AS (
SELECT ROW_NUMBER() OVER (ORDER BY id, set_id), code, value, COUNT(*) OVER ()
FROM (
SELECT 0 AS set_id, id, code, value
FROM allowedTokens
) AS src
),
-- ================================================
-- 使字符串区分大小写
-- ================================================
formatStrings (formatString) AS (
SELECT @format COLLATE Latin1_General_CS_AS
),
-- ================================================
-- 使用CTE递归替换标记
-- ================================================
recursiveReplace AS (
SELECT s.id,REPLACE(f.formatString,s.code,s.value) AS formattedDate,s.maxval
FROM formatStrings AS f
INNER JOIN substitutions AS s ON s.id = 1
UNION ALL
SELECT s.id, REPLACE(r.formattedDate, s.code,s.value) AS formattedDate,s.maxval
FROM recursiveReplace AS r
INNER JOIN substitutions AS s ON s.id = r.id + 1
)
-- ================================================
-- 结果的最后一行就是想要得到的结果
-- ================================================
SELECT @string=formattedDate FROM recursiveReplace WHERE id = maxval
RETURN @string;
END
GO

SELECT [dbo].[formatDate](GETDATE(), 'YYYY/MM/DD'),
[dbo].[formatDate](GETDATE(), 'YYMMDD'),
[dbo].[formatDate](GETDATE(), 'YYYY-MM-DD HH:mm:ss'),
[dbo].[formatDate](GETDATE(), 'YYYY-MM-DD hh:mm:ss tt')
...全文
1635 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjj911 2012-03-29
  • 打赏
  • 举报
回复
作为it人员每天必须吃蛋。这个必须的,有神奇功效
水区混混 2012-03-29
  • 打赏
  • 举报
回复
看不懂,唉。。
xiaoniu528 2012-03-29
  • 打赏
  • 举报
回复
看的令人蛋疼......
fupx2008 2012-03-29
  • 打赏
  • 举报
回复
蛋疼啊.
babydog01 2012-03-29
  • 打赏
  • 举报
回复
大家都在讲蛋痛,好像大家都有蛋似的。
wl076 2012-03-28
  • 打赏
  • 举报
回复
确实很蛋疼
fuxiaoyang13 2012-03-28
  • 打赏
  • 举报
回复
支持支持!!!!
用户 昵称 2012-03-28
  • 打赏
  • 举报
回复
真漂亮!
bean_sql 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 maco_wang 的回复:]

很强大的函数,小爱V5!
[/Quote]
liuxingguodu 2012-03-28
  • 打赏
  • 举报
回复
作为it人员每天必须吃蛋。这个必须的,有神奇功效
Jdragon 2012-03-28
  • 打赏
  • 举报
回复
路过啊
Ny-6000 2012-03-28
  • 打赏
  • 举报
回复


学习.
BlueSky4014 2012-03-28
  • 打赏
  • 举报
回复
看不懂。
翅膀又硬了 2012-03-28
  • 打赏
  • 举报
回复
能翻译成C++的再发一次吗?
Vidor 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 的回复:]

引用 21 楼 的回复:

目测有BUG


虾米bug?
[/Quote]

自己想,又不是我写的,现在不流行拿来主义。
skyworth98 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

目测有BUG
[/Quote]

虾米bug?
mdiaozhi 2012-03-28
  • 打赏
  • 举报
回复
没看懂。
wbd555 2012-03-27
  • 打赏
  • 举报
回复
看不懂·····
li72li72 2012-03-27
  • 打赏
  • 举报
回复
果然不错的贴!!!
dulvtianya 2012-03-27
  • 打赏
  • 举报
回复
回帖是种美德
加载更多回复(39)

11,849

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧