我正在尝试将2007年12月1日等单独部分的日期转换为SQL Server 2005中的日期时间。我尝试过以下方法:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
但是这会导致错误的日期。将三个日期值转换为适当的datetime格式的正确方法是什么?
我正在尝试将2007年12月1日等单独部分的日期转换为SQL Server 2005中的日期时间。我尝试过以下方法:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
但是这会导致错误的日期。将三个日期值转换为适当的datetime格式的正确方法是什么?
当前回答
SQL Server 2012有一个令人期待已久的新DATEFROMPARTS函数(如果日期无效,它将引发错误-我对基于dateadd的解决方案的主要反对意见):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
DATEFROMPARTS(ycolumn, mcolumn, dcolumn)
or
DATEFROMPARTS(@y, @m, @d)
其他回答
尝试CONVERT而不是CAST。
CONVERT允许使用第三个参数表示日期格式。
格式列表在这里:http://msdn.microsoft.com/en-us/library/ms187928.aspx
在另一个答案被选为“正确”答案后更新:
我真的不明白为什么选择的答案明显依赖于服务器上的NLS设置,而没有说明这一限制。
使用显式起点'19000101'更安全、更整洁。
create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int)
returns datetime2
as
begin
-- Note! SQL Server 2012 includes datetime2fromparts() function
declare @output datetime2 = '19000101'
set @output = dateadd(year , @Year - 1900 , @output)
set @output = dateadd(month , @Month - 1 , @output)
set @output = dateadd(day , @Day - 1 , @output)
set @output = dateadd(hour , @Hour , @output)
set @output = dateadd(minute , @Minute , @output)
set @output = dateadd(second , @Second , @output)
set @output = dateadd(ns , @Nanosecond , @output)
return @output
end
我知道OP正在询问SQL 2005的答案,但这个问题已经很老了,所以如果你正在运行SQL 2012或以上版本,你可以使用以下命令:
SELECT DATEADD(DAY, 1, EOMONTH(@somedate, -1))
参考: https://learn.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
Sql Server 2012有一个函数,它将根据部件(DATEFROMPARTS)创建日期。对于我们其他人来说,这是我创建的一个db函数,它将确定部件的日期(谢谢@Charles)…
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[func_DateFromParts]'))
DROP FUNCTION [dbo].[func_DateFromParts]
GO
CREATE FUNCTION [dbo].[func_DateFromParts]
(
@Year INT,
@Month INT,
@DayOfMonth INT,
@Hour INT = 0, -- based on 24 hour clock (add 12 for PM :)
@Min INT = 0,
@Sec INT = 0
)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(second, @Sec,
DATEADD(minute, @Min,
DATEADD(hour, @Hour,
DATEADD(day, @DayOfMonth - 1,
DATEADD(month, @Month - 1,
DATEADD(Year, @Year-1900, 0))))))
END
GO
你可以这样称呼它……
SELECT dbo.func_DateFromParts(2013, 10, 4, 15, 50, DEFAULT)
返回……
2013-10-04 15:50:00.000
试试这个问题:
SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS
YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS
MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1
结果:
2014 Ja 1
2015 Ja 1
2014 Ja 1
2015 Ja 1
2012 Ja 1
2010 Ja 1
2015 Ja 1