在SQL Server中自定义date/时间格式

我正在尝试编写一个存储过程,从表中select列并向ResultSet中添加2个额外的列。 这两个额外的列是date时间字段表中字段转换的结果。

date时间格式字段具有以下格式'YYYY-MM-DD HH:MM:SS.S'

2个附加字段应该采用以下格式:

  1. DDMMM
  2. HHMMT,其中T是“A”,下午是“P”

示例:如果字段中的数据是“2008-10-12 13:19:12.0”,则提取的字段应该包含:

  1. 12OCT
  2. 0119P

我曾尝试使用CONVERTstring格式,但没有任何格式匹配我想要得到的输出。 我正在考虑通过CONVERT提取字段数据,然后使用REPLACE,但是我当然需要一些帮助,因为我不确定。

谁可以精通存储过程帮助我在这里? 谢谢!

如果dt是你的date时间列,那么

对于1:

SUBSTRING(CONVERT(varchar, dt, 13), 1, 2) + UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3)) 

对于2:

 SUBSTRING(CONVERT(varchar, dt, 100), 13, 2) + SUBSTRING(CONVERT(varchar, dt, 100), 16, 3) 

使用DATENAME并将逻辑封装在函数中,而不是存储过程

 declare @myTime as DateTime set @myTime = GETDATE() select @myTime select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4) 

返回“14OCT”

处理date时尽量不要使用任何基于字符/string的操作。 它们是数字(浮点数),性能将受到这些数据types转换的影响。

挖掘我多年来编写的这些便利的转换…

 /* Common date functions */ --//This contains common date functions for MSSQL server /*Getting Parts of a DateTime*/ --//gets the date only, 20x faster than using Convert/Cast to varchar --//this has been especially useful for JOINS SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)) --//gets the time only (date portion is '1900-01-01' and is considered the "0 time" of dates in MSSQL, even with the datatype min value of 01/01/1753. SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))) /*Relative Dates*/ --//These are all functions that will calculate a date relative to the current date and time /*Current Day*/ --//now SELECT (GETDATE()) --//midnight of today SELECT (DATEADD(ms,-4,(DATEADD(dd,DATEDIFF(dd,0,GETDATE()) + 1,0)))) --//Current Hour SELECT DATEADD(hh,DATEPART(hh,GETDATE()),CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DateTime)) --//Current Half-Hour - if its 9:36, this will show 9:30 SELECT DATEADD(mi,((DATEDIFF(mi,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)), GETDATE())) / 30) * 30,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime))) /*Yearly*/ --//first datetime of the current year SELECT (DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)) --//last datetime of the current year SELECT (DATEADD(ms,-4,(DATEADD(yy,DATEDIFF(yy,0,GETDATE()) + 1,0)))) /*Monthly*/ --//first datetime of current month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) --//last datetime of the current month SELECT (DATEADD(ms,-4,DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))) --//first datetime of the previous month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()) -1,0)) --//last datetime of the previous month SELECT (DATEADD(ms, -4,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))) /*Weekly*/ --//previous monday at 12AM SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)) --//previous friday at 11:59:59 PM SELECT (DATEADD(ms,-4,DATEADD(dd,5,DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)))) /*Quarterly*/ --//first datetime of current quarter SELECT (DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0)) --//last datetime of current quarter SELECT (DATEADD(ms,-4,DATEADD(qq,DATEDIFF(qq,0,GETDATE()) + 1,0))) 

不是专门回答你的问题,但不是你的应用程序的表示层应该处理的东西。 按照您描述的方式进行操作会在数据库端创build额外的处理,并添加额外的networking通信量(假设数据库与应用程序存在于不同的计算机上),以便在应用程序一端可以轻松计算出更丰富的date处理库,以及更多的语言不可知论者,特别是在你的第一个例子中包含缩写的月份名称。 无论如何,如果你仍然决定走这条路,别人给你的答案应该指向正确的方向。

date时间格式字段具有以下格式'YYYY-MM-DD HH:MM:SS.S'

那个陈述是错误的。 这就是企业pipe理器或SQL Serverselect显示date的方式。 内部是一个8字节的二进制值,这就是为什么Andrew公布的一些函数能够很好地工作。

Kibbee也提出了一个有效的观点,在一个完美的世界里,我会同意他的观点。 但是,有时候你想直接将查询结果绑定到显示控件或小部件上,而且实际上没有机会做任何格式化。 有时,表示层位于比数据库更繁忙的Web服务器上。 考虑到这些,知道如何在SQL中执行此操作并不是一件坏事。

您可以在SQL Server中使用以下命令:

 select FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss') 

是的离开是一个解决scheme,但我认为这种方法是长途旅行!

SQL SERVER:

 SELECT CAST(DATEPART(DD,GETDATE()) AS VARCHAR)+'/' +CAST(DATEPART(MM,GETDATE()) AS VARCHAR) +'/'+CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR) +' '+CAST(DATEPART(HH,GETDATE()) AS VARCHAR) +':'+CAST(DATEPART(MI,GETDATE()) AS VARCHAR) 

甲骨文:

 Select to_char(sysdate,'DD/MM/YYYY HH24:MI') from dual 

你可以通过这种方式编写自己的function,你可以摆脱这个混乱;

http://sql.dzone.com/news/custom-date-formatting-sql-ser

 select myshortfun(getdate(),myformat) GO 

这里你需要DATEPART。 您可以将DATEPART调用的结果连接在一起。

要获得月份缩写,您可以使用DATENAME; 如果这不适用于您,则可以在DATEPART上使用CASE语句。

DATEPART也适用于时间领域。

我可以想到几种获取AM / PM指标的方法,包括比较通过DATEPARTbuild立的新date或者计算当天的总时间,并将其与已知的AM / PM阈值进行比较。

在MS SQL Server中,您可以执行以下操作:

SET DATEFORMAT ymd

年月日,

如果它是更为具体的像DateKeyyyyymmdd ),你需要维度模型,我build议没有任何强制转换/转换:

 DECLARE @DateKeyToday int = (SELECT 10000 * DATEPART(yy,GETDATE()) + 100 * DATEPART(mm,GETDATE()) + DATEPART(dd,GETDATE())); PRINT @DateKeyToday 

我添加这个答案(为我自己)与自定义格式相关。

下划线为yyyy_MM_dd

 REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),'-','_')