Pas*_*cal 12 sql sql-server datetime stored-procedures sql-convert
我正在尝试编写一个存储过程,从表中选择列,并向ResultSet添加2个额外的列.这两个额外的列是表中字段转换的结果,该字段是Datetime字段.
日期时间格式字段具有以下格式'YYYY-MM-DD HH:MM:SS.S'
另外两个字段应采用以下格式:
示例:如果字段中的数据为"2008-10-12 13:19:12.0",则提取的字段应包含:
我尝试过使用CONVERT字符串格式,但没有一种格式符合我想要的输出.我正在考虑通过CONVERT提取字段数据然后使用REPLACE,但我肯定需要一些帮助,因为我不确定.
任何精通存储过程的人都可以帮助我吗?谢谢!
Sti*_*ack 25
使用DATENAME并将逻辑包装在Function中,而不是Stored Proc
declare @myTime as DateTime
set @myTime = GETDATE()
select @myTime
select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)
Run Code Online (Sandbox Code Playgroud)
返回"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)))
Run Code Online (Sandbox Code Playgroud)
您可以在SQL Server中使用以下命令来实现:
select FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss')
Run Code Online (Sandbox Code Playgroud)
如果dt是你的datetime列,那么
1:
SUBSTRING(CONVERT(varchar, dt, 13), 1, 2)
+ UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3))
Run Code Online (Sandbox Code Playgroud)
2:
SUBSTRING(CONVERT(varchar, dt, 100), 13, 2)
+ SUBSTRING(CONVERT(varchar, dt, 100), 16, 3)
Run Code Online (Sandbox Code Playgroud)
没有具体回答您的问题,但不是应该由您的应用程序的表示层处理的东西.以您描述的方式执行此操作会在数据库端创建额外的处理以及添加额外的网络流量(假设数据库存在于与应用程序不同的计算机上),以便在应用程序端轻松计算,具有更丰富的日期处理库,以及更加语言无关,特别是在您的第一个包含缩写月份名称的示例的情况下.无论如何,如果您仍然决定走这条路,其他人给你的答案应该指向正确的方向.
| 归档时间: |
|
| 查看次数: |
95158 次 |
| 最近记录: |