Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从SQL Server中的部分日期和字符串创建新的日期时间?_Sql Server_Date - Fatal编程技术网

Sql server 如何从SQL Server中的部分日期和字符串创建新的日期时间?

Sql server 如何从SQL Server中的部分日期和字符串创建新的日期时间?,sql-server,date,Sql Server,Date,我将如何计算月份,将“/01/”附加到月份,然后将年份附加到月份,最后将“00:01 AM”附加到月份。我希望它最终看起来像这样: 2018/01/01 00:01 AM 我设法在ACCESS中实现了这一点,但在SQL Server中无法实现这一点。非常感谢你的帮助 使用此脚本可以获得所需的结果: DECLARE @Date DATETIME; SET @Date = '2018-01-02 13:45:30.000'; SELECT CAST(YEAR(@Date) AS CHAR(4))

我将如何计算月份,将
“/01/”
附加到月份,然后将年份附加到月份,最后将
“00:01 AM”
附加到月份。我希望它最终看起来像这样:

2018/01/01 00:01 AM

我设法在
ACCESS
中实现了这一点,但在SQL Server中无法实现这一点。非常感谢你的帮助

使用此脚本可以获得所需的结果:

DECLARE @Date DATETIME;
SET @Date = '2018-01-02 13:45:30.000';
SELECT CAST(YEAR(@Date) AS CHAR(4)) + '/' + CASE WHEN MONTH(@Date) >= 10 THEN '' ELSE '0' END + CAST(MONTH(@Date) AS VARCHAR(2)) + '/01 00:01 AM';
编辑: 您还可以创建函数并使其可重用:

CREATE FUNCTION dbo.InitializeDate(@Date DATETIME)
RETURNS VARCHAR(19)
AS
BEGIN
    RETURN CAST(YEAR(@Date) AS CHAR(4)) + '/' + CASE WHEN MONTH(@Date) > 10 THEN '' ELSE '0' END + CAST(MONTH(@Date) AS VARCHAR(2)) + '/01 00:01 AM';
END
GO

-- Usage example:
SELECT dbo.InitializeDate('2018-01-02 13:45:30.000') AS MyDate;
GO

-- Output:
2018/01/01 00:01 AM

很明显,有不同的方法-并且总是提到您正在使用的版本,因为这会影响可用的功能。我要说的是,像你描述的那样需要一段时间是非常不寻常的。我担心你做出了一个假设,选择了一条可能会变成问题的道路。我建议您阅读datetime数据类型的讨论(以及其他所有内容)。一种可能的方法是,通过分步演示可用的功能,让您思考:

set nocount on;
declare @x datetime = '20180102 13:45:30.000';
with cte as (select cast('20180102 13:45:30.000' as datetime) as d1 union all
    select '20180101 13:45:01:997' union all
    select '20180228 00:00:05.003' union all
    select '20120229 12:11:30.007') 
select d1, 
datefromparts(year(d1), month(d1), 1),
dateadd(second, 1, cast(datefromparts(year(d1), month(d1), 1) as datetime)) 
from cte;

使用
Concat
Cast

用变量/字段替换
getdate()

select cast(concat(year(getdate()),right(concat('0',month(getdate())),2),'01',' 00:01 AM') as datetime)


重新开始。你的出发点是什么?它是一根绳子吗?如果是,它包含什么(以及您期望的模式)?如果不是,是日期还是datetime或int还是什么?我有一个datetime字段,其值为“2018-01-02 13:45:30.000”。或多或少,我如何将该日期的日期更改为01,时间更改为00:01 AM。我需要为整个专栏做这件事,日期和时间各不相同。谢谢。第一个非常好用!Getdate()工作得更好,因为我正在提取上个月的数据。我只是想知道,一旦1月份回潮,我想调出12月份的数据,我将如何应对这一年。我正在尝试将此作为每月任务自动完成。然后使用
dateadd(month,-1,getdate())
。。。如果今天是1月,那这一年还会倒退吗?
select convert(varchar(22),cast(concat(year(getdate()),right(concat('0',month(getdate())),2),'01',' 00:01 AM') as datetime),100)