我正在尝试编写一个存储过程,该过程从表中选择列并向结果集中添加 2 个额外列。这 2 列额外的列是表中某个字段(日期时间字段)转换的结果。
日期时间格式字段具有以下格式“YYYY-MM-DD HH:MM:SS.S”
这 2 个附加字段应采用以下格式:
示例:如果字段中的数据为“2008-10-12 13:19:12.0”,则提取的字段应包含:
我尝试过使用 CONVERT 字符串格式,但没有一种格式与我想要获得的输出匹配。我正在考虑通过 CONVERT 提取字段数据,然后使用 REPLACE,但我确实需要一些帮助,因为我不确定。
任何精通存储过程的人都可以帮助我吗? 谢谢!
使用 DATENAME 并将逻辑包装在函数中,而不是存储过程中
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')
如果 dt 是您的日期时间列,则
对于 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)
没有具体回答您的问题,但这不是应该由应用程序的表示层处理的事情。 按照您描述的方式执行此操作会在数据库端创建额外的处理,并添加额外的网络流量(假设数据库与应用程序存在于不同的计算机上),以便可以在应用程序端轻松计算,并具有更丰富的数据处理库,并且更加与语言无关,特别是在第一个示例包含缩写的月份名称的情况下。 无论如何,如果您仍然决定走这条路,其他人给出的答案应该为您指明正确的方向。
日期时间格式字段具有以下格式“YYYY-MM-DD HH:MM:SS.S”
该说法是错误的。 这正是企业管理器或 SQL Server 选择“显示”日期的方式。 在内部它是一个 8 字节的二进制值,这就是为什么 Andrew 发布的一些函数能够很好地工作的原因。 Kibbee 的观点也有道理,在完美的世界里我会同意他的观点。 但是,有时您希望将查询结果直接绑定到显示控件或小部件,但实际上没有机会进行任何格式化。 有时,表示层位于比数据库更繁忙的 Web 服务器上。 考虑到这些,了解如何在 SQL 中执行此操作不一定是坏事。
SQL 服务器:
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
要获取月份缩写,您可以使用 DATENAME;如果这对您不起作用,您可以在 DATEPART 上使用 CASE 语句。
DATEPART 也适用于时间字段。
我可以想到几种获取 AM/PM 指示器的方法,包括比较通过 DATEPART 构建的新日期或计算一天中经过的总秒数并将其与已知的 AM/PM 阈值进行比较。
设置日期格式 ymd
年, 月, 天,
DateKey
(
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),'-','_')