SQL Server 2008中的格式化日期

iSQlServer發表於2009-10-16
我們都知道不同的國家要求不同的日期格式。不同的應用程式要求不同的日期格式。SQL Server資料庫管理員和開發人員將函式convert()和其它日期函式例如datepart()、datename()等等一起使用來操縱輸出的格式。這篇文章介紹怎樣建立一個普通函式來獲得不同國家和應用程式所要求的大多數格式。

  讓我們來建立dbo.format_date 函式,如下所示。

  

      /****** Object: UserDefinedFunction [dbo].[format_date]

  Script Date: 05/12/2009 23:19:35 ******/

  IF EXISTS (SELECT * FROM sys.objects

  WHERE object_id = OBJECT_ID(N'[dbo].[format_date]')

  AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))

  DROP FUNCTION [dbo].[format_date]

  GO

  /****** Object: UserDefinedFunction [dbo].[format_date]

  Script. Date: 05/12/2009 23:19:18 ******/

  SET ANSI_NULLS ON

  GO

  SET QUOTED_IDENTIFIER ON

  GO

  SET CONCAT_NULL_YIELDS_NULL OFF

  go

  CREATE function [dbo].[format_date]

  (@inputdate datetime ,@format varchar(500))

  returns varchar(500)

  as

  begin

  declare @year varchar(4) --YYYY

  declare @shortyear varchar(4) --Yr

  declare @quarter varchar(4) --QQ

  declare @month varchar(2) --MM

  declare @week varchar(2) --WW

  declare @day varchar(2) --DD

  declare @24hours varchar(2) --24HH

  declare @12hours varchar(2) --HH

  declare @minutes varchar(2) --MI

  declare @seconds varchar(2) --SS

  declare @milliseconds varchar(3) --MS

  declare @microseconds varchar(6) --MCS

  declare @nanoseconds varchar(9) --NS

  declare @dayname varchar(15) --DAY

  declare @monthname varchar(15) --MONTH

  declare @shortmonthname varchar(15) --MON

  declare @AMPM varchar(15) --AMPM

  declare @TZ varchar(15) --TZ

  declare @UNIXPOSIX varchar(15) --UNIXPOSIX

  --UCASE

  --LCASE

  declare @formatteddate varchar(500)

  --Assign current date and time to

  if (@inputdate is NULL or @inputdate ='')

  begin

  set @inputdate = getdate()

  end

  if (@format is NULL or @format ='')

  begin

  set @format ='YYYY-MM-DD 12HH:MI:SS AMPM'

  end

--set all values

  set @year = convert(varchar(4),year(@inputdate))

  set @shortyear = right(@year,2)

  set @quarter = convert(varchar(1),datepart(QQ,(@inputdate)))

  set @month = right('0'+convert(varchar(2),month(@inputdate)),2)

  set @week = right('0'+convert(varchar(2),datepart(ww,(@inputdate))),2)

  set @day = right('0'+convert(varchar(2),day(@inputdate)),2)

  set @24hours = right('0'+convert(varchar(2),datepart(hh,@inputdate)),2)

  set @TZ = convert(varchar(10),datename(TZ,convert(varchar(20),@inputdate)))

  set @UNIXPOSIX = convert(varchar(15),datediff(ss,convert(datetime,'01/01/1970 00:00:000'),@inputdate))

  if datepart(hh,@inputdate) >12

  begin

  set @12hours = right('0'+convert(varchar(2),datepart(hh,@inputdate)) -12,2)

  end

  else

  begin

  set @12hours = right('0'+convert(varchar(2),datepart(hh,@inputdate)) ,2)

  end

  if datepart(hh,@inputdate) >11

  begin

  set @AMPM ='PM'

  end

  else

  begin

  set @AMPM ='AM'

  end

  set @minutes = right('0'+convert(varchar(2),datepart(n,@inputdate)),2)

  set @seconds = right('0'+convert(varchar(2),datepart(ss,@inputdate)),2)

  set @milliseconds = convert(varchar(3),datepart(ms,@inputdate))

  set @microseconds = convert(varchar(6),datepart(mcs,@inputdate))

  set @nanoseconds = convert(varchar(9),datepart(ns,@inputdate))

  set @dayname = datename(weekday,@inputdate)

  set @monthname = datename(mm,@inputdate)

  set @shortmonthname= left(datename(mm,@inputdate),3)

  set @formatteddate = @format

  set @formatteddate=replace(@formatteddate,'MONTH',@monthname)

  set @formatteddate=replace(@formatteddate,'MON',@shortmonthname)

  set @formatteddate=replace(@formatteddate,'AMPM',@AMPM)

  set @formatteddate=replace(@formatteddate,'YYYY',@year)

  set @formatteddate=replace(@formatteddate,'Yr',@shortyear)

  set @formatteddate=replace(@formatteddate,'QQ',@quarter)

  set @formatteddate=replace(@formatteddate,'WW',@week)

  set @formatteddate=replace(@formatteddate,'MM',@month)

  set @formatteddate=replace(@formatteddate,'DD',@Day)

  set @formatteddate=replace(@formatteddate,'24HH',@24hours)

  set @formatteddate=replace(@formatteddate,'12HH',@12hours)

  set @formatteddate=replace(@formatteddate,'Mi',@minutes)

  set @formatteddate=replace(@formatteddate,'SS',@seconds)

  set @formatteddate=replace(@formatteddate,'MS',@milliseconds)

  set @formatteddate=replace(@formatteddate,'MCS',@microseconds)

  set @formatteddate=replace(@formatteddate,'NS',@nanoseconds)

  set @formatteddate=replace(@formatteddate,'DAY',@dayname)

  set @formatteddate=replace(@formatteddate,'TZ',@TZ)

  set @formatteddate=replace(@formatteddate,'UNIXPOSIX',@UNIXPOSIX)

  if charindex('ucase',@formatteddate)<>0

  begin

  set @formatteddate=replace(@formatteddate,'ucase','')

  set @formatteddate=upper(@formatteddate)

  end

      if charindex('lcase',@formatteddate)<>0

  begin

  set @formatteddate=replace(@formatteddate,'lcase','')

  set @formatteddate=lower(@formatteddate)

  end

  return @formatteddate

  end

  GO

現在讓我們使用不同的場景來看看這個函式的使用。下面關鍵字中的任何一個都可以聯合使用來顯示不同格式的日期。

  YYYY - YYYY格式的年份,包括百年

  Yr - YY格式的年份

  QQ - 顯示季度

  MM - 顯示月份

  WW - 顯示星期

  DD - 顯示日子

  24HH - 以24小時制的形式顯示小時

  12HH - 以12小時制的形式顯示小時

  MI - 顯示分鐘

  SS - 顯示秒

  MS - 顯示毫秒

  MCS - 顯示微秒

  NS - 顯示十億分之一秒

  DAY - 顯示日子的名稱,例如:Monday

  MONTH- - 顯示月份的名稱,例如:August

  MON - 顯示短的月份名稱,例如:Aug

  AMPM - 顯示AM/PM 用於12小時制格式

  TZ - 顯示時間偏移

  UNIXPOSIX - 顯示unix posix時間。秒數從1/1/1970開始

  UCASE - 以大寫顯示結果

  LCASE - 以小寫顯示結果

  場景 1

  如果你想以YYYY/MM/DD的形式顯示日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY/MM/DD') as Date

  結果:

  Date

  --------------

  2009/01/12

  場景 2

  要以YYYY-MM-DD格式顯示日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY-MM-DD') as Date

  結果:

  Date

  -------------------

  2009-01-12

  場景 3

  要顯示年份和季節,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'Year: YYYY, Quarter: QQ ') as Date

  結果:

  Date

  -----------------------

  Year: 2009, Quarter: 1

  場景 4

  要以24小時制格式顯示時間,執行下面的命令。

  select dbo.format_date(GETDATE(),'24HH:MI:SS') as Time

  結果:

  Time

  ------------------------

  23:10:07

  場景 5

  要以12小時制格式顯示時間,執行下面的命令。

  select dbo.format_date(GETDATE(),'12HH:MI:SS AMPM') as Time

  結果:

  Time

  -----------------------

  11:11:02 PM

場景 6

  要以日期形式為YYYY/MM/DD 和時間形式為24小時制來顯示,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY/MM/DD 24HH:MI:SS') as DateTime

  結果:

  DateTime

  -----------------------

  2009/01/12 23:11:44

  場景 7

  要以日期形式為YYYY/MM/DD和時間形式為12小時制來顯示,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY/MM/DD 12HH:MI:SS AMPM') as DateTime

  結果:

  DateTime

  -------------------------

  2009/01/12 11:13:27 PM

  場景 8

  要以DD-MM-YY 的形式來顯示日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'DD-MM-YR') as Date

  結果:

  Date

  ------------------------

  12-01-09

  場景 9

  要以DDMMYY的形式顯示日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'DDMMYR') as Date

  結果:

  Date

  ----------------------

  120109

  場景 10

  要顯示日期和時間以你可以使用它來作為檔名稱字尾的形式,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY_MM_DD_HH_MI_SS_MS_MCS_NS') as FileNameSuffix

  結果:

  FileNameSuffix

  --------------------------------------------

  2009_01_12_HH_16_18_200_200000_200000000

  場景 11

  要顯示日期、時間、月份名稱和日子的名稱,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'DAY, MONTH DD, YYYY 12HH:MI:SS AMPM') as DateTime

  結果:

  DateTime

  ---------------------------------------

  Monday, January 12, 2009 11:20:31 PM

  場景 12

  要以時間偏移量來顯示日期、時間、月份名稱和日子的名稱,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'DAY MONTH DDth, YR 12HH:MI:SS TZ') as DateTime

  結果:

  DateTime

  ------------------------------------------

  Monday January 12th, 09 11:21:42 +00:00

場景 13

  要顯示unix posix時間,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'Your Unix time is: UNIXPOSIX') as POSIX

  結果:

  POSIX

  ----------------------------------

  Your Unix time is: 1231802580

  場景 14

  要顯示年份和星期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'Year: YYYY, Week: WW') as YearWeek

  結果:

  YearWeek

  -------------------------

  Year: 2009, Week: 03

  場景15

  要顯示帶有月份名稱的日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY-MONTH-DD') as Date

  結果:

  Date

  --------------------------

  2009-January-12

  場景16

  要顯示帶有短的月份名稱的日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY-MON-DD') as Date

  結果:

  Date

  ------------------------

  2009-Jan-12

  場景17

  要顯示帶有大寫的短的月份名稱的日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY-MON-DD ucase') as Date

  結果:

  Date

  ----------------------

  2009-JAN-12

  場景18

  要顯示帶有小寫的月份名稱的日期,那麼執行下面的命令。

  select dbo.format_date(GETDATE(),'YYYY-MONTH-DD lcase') as Date

  結果:

  Date

  -------------------

  2009-january-12

  場景19

  如果你不傳遞引數,那麼這個函式使用預設的格式化日期和時間的方法。執行下面的命令:

  select dbo.format_date(NULL,NULL)

  select dbo.format_date(NULL,'YYYY')

  select dbo.format_date(getdate(),NULL)

  結果:

  Date

  -----------------------

  2009-01-12 11:29:17 PM

  Year

  -----------------------

  2009

  Date

  -----------------------

  2009-01-12 11:29:17 PM

  這篇文章介紹了怎樣建立一個命令函式來獲得不同國家和應用程式所要求的大多數日期格式。

原文地址:http://database.ctocio.com.cn/68/8929568_4.shtml

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616726/,如需轉載,請註明出處,否則將追究法律責任。

相關文章