3

我在 SQL Server 2017 中有一个表。在此表中,日期以小数形式存储为下一种格式:

20180717164540.2200000

YYYYMMDDhhmiss.nnnnnnn

4 位表示年份,2 位表示日历月,2 位表示月份中的一天,2 位表示 24 小时制的 UTC 时间,2 位表示一小时,2 位表示秒一分钟和小数秒。

我的目标是将这种格式转换为 DateTime 并将其存储在数据库的另一个表中。所以我的问题是如何在 SQL Server 中将此格式转换为 DateTime 格式。据我所知,您不能像在 Oracle 中那样创建自定义日期格式。

我用FORMAT AND CONVERT MSSQL 函数尝试了很多次,但它不起作用。

SELECT FORMAT(CONVERT(NVARCHAR(22), DECIMALCOLUMN), 'YYYYMMDDhhmiss') FROM SOURCE-TABLE;

谢谢您的帮助!

4

7 回答 7

5

你真的很接近你的 FORMAT 想法。FORMAT 为您提供 NVARCHAR 输出,您可以将其显式 CAST 为 DATETIME2(7) (保持您的精度级别)。

DECLARE @dateWannaBe DECIMAL(21,7) = 20180717164540.2200000;

SELECT CAST(FORMAT(@dateWannaBe,'####-##-## ##:##:##.#######', 'en-US') AS DATETIME2(7)) AS ActualDateTime2;

+-----------------------------+
|       ActualDateTime2       |
+-----------------------------+
| 2018-07-17 16:45:40.2200000 |
+-----------------------------+

编辑:根据@JeroenMostert 的评论,将文化参数添加到 FORMAT 函数中。

于 2018-07-18T13:42:38.410 回答
2

很多馅

declare @dt decimal(30,8)   = 20180717164540.2200000

select  @dt, convert(datetime2, 
                     stuff(
                           stuff(
                                 stuff(
                                       convert(varchar(30), @dt), 
                                       9, 0, ' '), 
                                 12, 0, ':'), 
                            15, 0, ':')
                      )

/* RESULT
20180717164540.22000000 2018-07-17 16:45:40.2200000
*/
于 2018-07-18T13:12:43.143 回答
1

您需要具有以下SUBSTRING()功能的功能stuff()

select dateadd(ss, datediff(ss, 0, cast(stuff(stuff(substring(cast(@date as varchar(30)), 9, 20), 3, 0, ':'), 6, 0, ':') as datetime2)), 
                   substring(cast(@date as varchar(10)), 1, 8)
              )
. . .
于 2018-07-18T13:12:34.997 回答
1

尝试这个:

DECLARE @date DECIMAL (30,7) =20180717164540.2200000

SELECT CONVERT(DATETIME, SUBSTRING(CONVERT(VARCHAR, @date),1,4) + '-' + SUBSTRING(CONVERT(VARCHAR, @date),5,2)
+ '-' + SUBSTRING(CONVERT(VARCHAR, @date),7,2) + ' ' + SUBSTRING(CONVERT(VARCHAR, @date),9,2) + ':' +
SUBSTRING(CONVERT(VARCHAR, @date),11,2) + ':' + SUBSTRING(CONVERT(VARCHAR, @date),13,2) + '.' + SUBSTRING(CONVERT(VARCHAR, @date),16,2))
于 2018-07-18T13:10:03.840 回答
0

您可以填充并使用 DateTime2 而不是 DateTime:

select 
  cast(stuff(stuff(stuff(
    cast(mydate as varchar(30)),
  13,0,':'),
  11,0,':'),
  9,0,' ') as datetime2) as myDateTime from myTable;
于 2018-07-18T13:23:21.200 回答
0
DECLARE @TIME DECIMAL(38,8)

SET @TIME = '20180717164540.2200000'



SELECT CAST([DT] AS DATETIME) FROM(
SELECT LEFT(CAST(@TIME AS VARCHAR),4)  + 
SUBSTRING(CAST(@TIME AS VARCHAR),5,2)  + 
SUBSTRING(CAST(@TIME AS VARCHAR),7,2)  + ' ' +
SUBSTRING(CAST(@TIME AS VARCHAR),9,2) + ':'+
SUBSTRING(CAST(@TIME AS VARCHAR),11,2)  + ':' +
SUBSTRING(CAST(@TIME AS VARCHAR),13,2) AS DT
) AS X
于 2018-07-18T13:13:49.237 回答
0

另一种方法,LEFT使用SUBSTRINGRIGHT

DECLARE @str nvarchar(22) = '20180717164540.2200000'

SELECT CONVERT(datetime2, 
               LEFT(@str,4)+
               SUBSTRING(@str,5,2)+
               SUBSTRING(@str,7,2)+' '+
               SUBSTRING(@str,9,2)+':'+
               SUBSTRING(@str,11,2)+':'+
               SUBSTRING(@str,13,2)+'.'+
               RIGHT(@str,7))
于 2018-07-18T13:22:14.773 回答