SQL Server中的自定义日期/时间格式

我正在尝试编写一个存储过程,从表中选择列,并向ResultSet添加2个额外的列。这两个额外的列是表中字段转换的结果,该字段是Datetime字段。 日期时间格式字段具有以下格式'YYYY-MM-DD HH:MM:SS.S' 另外两个字段应采用以下格式: DDMMM HHMMT,其中T对于a.m是'A'而对于p.m是'P'。 示例:如果字段中的数据为“2008-10-12 13:19:12.0”,则提取的字段应包含: 12OCT 0119P 我尝试过使用CONVERT字符串格式,但没有一种格式符合我想要的输出。我正在考虑通过CONVERT提取字段数据然后使用REPLACE,但我肯定需要一些帮助,因为我不确定。 任何精通存储过程的人都可以帮助我吗? 谢谢!     
已邀请:
如果dt是你的datetime列,那么 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并将逻辑包装在Function中,而不是Stored Proc
declare @myTime as DateTime

set @myTime = GETDATE()

select @myTime

select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)
返回“14OCT” 在处理日期时尽量不要使用任何基于字符/字符串的操作。它们是数字(浮点数),性能将受到这些数据类型转换的影响。 挖掘我多年来编译的这些方便的转换......
/* 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)))
    
没有具体回答您的问题,但不是应该由您的应用程序的表示层处理的事情。以您描述的方式执行此操作会在数据库端创建额外的处理以及添加额外的网络流量(假设数据库存在于与应用程序不同的计算机上),以便在应用程序端轻松计算,具有更丰富的日期处理库,以及更加语言无关,特别是在您的第一个包含缩写月份名称的示例的情况下。无论如何,如果您仍然决定走这条路,其他人给你的答案应该指向正确的方向。     
您可以在SQL Server中使用以下命令来实现:
select FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss')
    
  日期时间格式字段具有以下格式'YYYY-MM-DD HH:MM:SS.S' 那句话是错误的。这就是企业管理器或SQL Server选择显示日期的方式。在内部它是一个8字节的二进制值,这就是安德鲁发布的一些函数能够很好地工作的原因。 Kibbee也是一个有效的观点,在一个完美的世界里,我会同意他的观点。但是,有时您希望将查询结果直接绑定到显示控件或小部件,并且实际上没有机会进行任何格式化。有时,表示层存在于比数据库更繁忙的Web服务器上。考虑到这些,知道如何在SQL中执行此操作并不一定是件坏事。     
是Depart是一个解决方案,但我认为这种方法是长途旅行! 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
你可以通过这种方式编写自己的功能,你可以摆脱这种混乱; http://sql.dzone.com/news/custom-date-formatting-sql-ser
select myshortfun(getdate(),myformat)
GO
    
你在这里需要DATEPART。您可以将DATEPART调用的结果连接在一起。 要获得月份缩写,您可以使用DATENAME;如果这对您不起作用,您可以在DATEPART上使用CASE语句。 DATEPART也适用于时间领域。 我可以想到几种获取AM / PM指标的方法,包括比较通过DATEPART构建的新日期或计算当天经过的总秒数,并将其与已知的AM / PM阈值进行比较。     
在MS SQL Server中,您可以执行以下操作: 设置日期格式ymd 年, 月, 天,     
如果它是比较specific8ѭ(
yyyymmdd
)更具体的东西,你需要尺寸模型,我建议没有任何演员/转换的东西:
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),'-','_')
    

要回复问题请先登录注册