设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

BCM 门户 IT世界 应用开发 查看内容

How to format datetime & date in Sql Server 2005

2011-10-5 16:07| 发布者: Test| 查看: 2027| 评论: 0

摘要: Execute the following Microsoft SQL Server T-SQL datetime and date formatting scripts in Management Studio Query Editor to demonstrate the multitude of temporal data formats available in SQL Server. F ...

Cory Says: 

Hey Anubhav,
This is a great post, thanks. I took your fnFormatDate function and added some functionality to it, namely time formatting. I hope the comment box doesn’t mess it up too much.

I made a small adjustment to the function. It now formats the hour smartly based on whether ‘ampm’ is used. Before it would always use the 24 hour based time.

ALTER FUNCTION [dbo].[BZSFormatDate] (
@Datetime DATETIME
,@FormatMask VARCHAR(64)
)
RETURNS VARCHAR(64)
AS
BEGIN
–Expanded on the function shown here:
http://anubhavg.wordpress.com/2009/06/11/how-to-format-datetime-date-in-sql-server-2005/
–”COLLATE SQL_Latin1_General_CP1_CS_AS” tells SQL to be case sensative

DECLARE
@StringDate VARCHAR(64)
,@Month VARCHAR(12)
,@MON VARCHAR(3)
,@24H BIT

SET @StringDate = @FormatMask
SET @24H = 1

–Special Codes (Codes that return more letters)
—————————————————————————————————
IF (CHARINDEX (‘Month’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘Month’, ‘|Q|’)

IF (CHARINDEX (‘MON’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘MON’, ‘|E|’)

IF (CHARINDEX (‘AMPM’, @StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0)
BEGIN
SET @StringDate = REPLACE(@StringDate, ‘AMPM’ COLLATE SQL_Latin1_General_CP1_CS_AS, ‘|X|’)
SET @24H = 0
END

IF (CHARINDEX (‘ampm’, @StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0)
BEGIN
SET @StringDate = REPLACE(@StringDate, ‘ampm’ COLLATE SQL_Latin1_General_CP1_CS_AS, ‘|x|’)
SET @24H = 0
END

–DATE
—————————————————————————————————
IF (CHARINDEX (‘YYYY’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YYYY’, DATENAME(YY, @Datetime))

IF (CHARINDEX (‘YY’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘YY’, RIGHT(DATENAME(YY, @Datetime), 2))

IF (CHARINDEX (‘MM’, @StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0)
SET @StringDate = REPLACE(@StringDate, ‘MM’ COLLATE SQL_Latin1_General_CP1_CS_AS, RIGHT(’0′ + CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2))

IF (CHARINDEX (‘M’, @StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0)
SET @StringDate = REPLACE(@StringDate, ‘M’ COLLATE SQL_Latin1_General_CP1_CS_AS, CONVERT(VARCHAR, DATEPART(MM, @Datetime)))

IF (CHARINDEX (‘DD’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘DD’, RIGHT(’0′ + DATENAME(DD, @Datetime),2))

IF (CHARINDEX (‘D’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘D’, DATENAME(DD, @Datetime))

–TIME
—————————————————————————————————
IF (CHARINDEX (‘h’, @StringDate) > 0)
BEGIN
DECLARE @Hour INT; SET @Hour = DATEPART(HH, @Datetime)
SELECT @Hour = CASE WHEN @24H = 0 THEN CASE WHEN @Hour > 12 THEN @Hour – 12 ELSE @Hour END ELSE @Hour END

IF (CHARINDEX (‘hh’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘hh’, RIGHT(’0′ + CONVERT(VARCHAR, @Hour), 2))

IF (CHARINDEX (‘h’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘h’, @Hour)
END

IF (CHARINDEX (‘mm’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘mm’, RIGHT(’0′ + CONVERT(VARCHAR, DATEPART(mi, @Datetime)), 2))

IF (CHARINDEX (‘m’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘m’, DATEPART(mi, @Datetime))

IF (CHARINDEX (‘ss’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘ss’, RIGHT(’0′+CONVERT(VARCHAR,DATEPART(ss, @Datetime)),2))

IF (CHARINDEX (‘s’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘s’, DATEPART(ss, @Datetime))

–Special Codes
— Must be done last because they replace the code with letters that could be seen as another code (‘m’)
—————————————————————————————————
IF (CHARINDEX (‘|Q|’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘|Q|’, DATENAME(MM, @Datetime))

IF (CHARINDEX (‘|E|’, @StringDate) > 0)
SET @StringDate = REPLACE(@StringDate, ‘|E|’, LEFT(DATENAME(MM, @Datetime),3))

IF (CHARINDEX (‘|X|’, @StringDate) > 0)
BEGIN
DECLARE @AMPM VARCHAR(2)
IF DATEPART(HH, @Datetime) > 12
SET @AMPM = ‘pm’
ELSE
SET @AMPM = ‘am’

IF CHARINDEX (‘|X|’, @StringDate COLLATE SQL_Latin1_General_CP1_CS_AS) > 0
SET @AMPM = UPPER(@AMPM)

SET @StringDate = REPLACE(@StringDate, ‘|X|’, @AMPM)
END

RETURN @StringDate
END
GO

SELECT [dbo].[BZSFormatDate] (’1/31/09 22:15:45:222′, ‘Month MON MM/DD/YYYY @ hh:mm:ss ampm’)

12

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-13 20:00 , Processed in 0.011303 second(s), 16 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

返回顶部