Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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中将日期拆分为两列(日期和时间)_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在SQL中将日期拆分为两列(日期和时间)

在SQL中将日期拆分为两列(日期和时间),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试将表中的数字日期键转换为日期时间键。我目前的查询是: SELECT DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+ SUBSTRING([Date],10,2)+':'+ SUBSTRING([Date],12,2)+':'+ SUBSTRING([Date],14,2)+'.'+ SUBSTRING([Date],15,3))) [Date], [Object] AS [Dataset], S

我正在尝试将表中的数字日期键转换为日期时间键。我目前的查询是:

  SELECT 
  DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
  SUBSTRING([Date],10,2)+':'+
  SUBSTRING([Date],12,2)+':'+
  SUBSTRING([Date],14,2)+'.'+
  SUBSTRING([Date],15,3))) [Date],
  [Object] AS [Dataset],
  SUBSTRING(Parms,1,6) AS [Media]
  FROM (Select CONVERT(VARCHAR(18),[Date]) [Date], 
  [Object],
  MsgId,
  Parms
  FROM JnlDataSection) A
  Where MsgID = '325' AND
  SUBSTRING(Parms,1,6) = 'V40449' 
  Order By Date DESC;
“日期”列显示以下内容: 2013-06-22 13:36:44.403

我想将其分为两列: 日期: 2013-06-22

时间(以微秒计): 13:36:44


有人可以修改我现有的查询以显示所需的输出吗?我们将不胜感激。请注意:我正在使用SQL Server Management Studio 2008。

您可能需要研究convert()函数:

  select convert(date, getdate()) as [Date], convert(varchar(8), convert(time, getdate())) as [Time]
给予

  Date       Time
  ---------- --------
  2013-07-16 15:05:43
在原始SQL的基础上进行包装,会产生公认的非常糟糕的结果:

SELECT convert(date, 
      DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
        SUBSTRING([Date],10,2)+':'+
        SUBSTRING([Date],12,2)+':'+
        SUBSTRING([Date],14,2)+'.'+
        SUBSTRING([Date],15,3)))) [Date],
  convert(varchar(8), convert(time, 
      DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
        SUBSTRING([Date],10,2)+':'+
        SUBSTRING([Date],12,2)+':'+
        SUBSTRING([Date],14,2)+'.'+
        SUBSTRING([Date],15,3))))) [Time],

  [Object] AS [Dataset],
  SUBSTRING(Parms,1,6) AS [Media]
  FROM (Select CONVERT(VARCHAR(18),[Date]) [Date], 
  [Object],
  MsgId,
  Parms
  FROM JnlDataSection) A
  Where MsgID = '325' AND
  SUBSTRING(Parms,1,6) = 'V40449' 
  Order By Date DESC;
您可能希望将其中的一部分移动到视图中,以降低复杂性。

您可以使用:

结果:

Date_AsVarChar       Date_AsDateTime         OnlyDate   OnlyTime
-------------------- ----------------------- ---------- --------
20130622133644403    2013-06-22 13:36:44.403 2013-06-22 13:36:44
解决方案:

SELECT 
    CONVERT(DATE,y.Date_AsDateTime) AS OnlyDate,
    CONVERT(TIME(0),y.Date_AsDateTime) AS OnlyTime
FROM(
    SELECT [Object], MsgId, Parms,
        CONVERT(DATETIME, STUFF(STUFF(STUFF(STUFF(x.[Date],9,0,' '),12,0,':'),15,0,':'),18,0,'.')) AS Date_AsDateTime
    FROM JnlDataSection
) A
WHERE   MsgID = '325' 
-- SUBSTRING(Parms,1,6) = 'V40449' is not SARG-able
AND     Parms LIKE 'V40449%' 
ORDER BY DATE DESC;

使用以下场景获取日期、时间、日、月、年、小时、分钟、秒、AM/PM:

select 
   UpdatedOn , CONVERT(varchar,UpdatedOn,100) DateTime, CONVERT(varchar,UpdatedOn,10) Date , 
   CONVERT(varchar,UpdatedOn,108) Time , substring(CONVERT(varchar,UpdatedOn,106),1,2) Day, 
   substring(CONVERT(varchar,UpdatedOn,106),4,3) CMonth,    
   substring(CONVERT(varchar,UpdatedOn,105),4,2) 
   NMonth, substring(CONVERT(varchar,UpdatedOn,106),8,4) Year,      
   left(right(CONVERT(varchar,UpdatedOn,100),7),2) Hours_12, 
   substring(CONVERT(varchar,UpdatedOn,108),1,2) Hours_24, 
   substring(CONVERT(varchar,UpdatedOn,108),4,2) Minutes, 
   substring(CONVERT(varchar,UpdatedOn,108),7,2) Second, right(CONVERT(varchar,UpdatedOn,100),2)    
   AM_PM 
from 
   dbo.DeviceAssignSim where AssignSimId=55;

如何让它显示问题所需的输出?用原始SQL中的[Date]字段替换getdate()。我将稍微更新答案,以包含您的原始问题。我将在我的查询中添加这些问题?您是否可以将其添加到我现有的查询中,然后将其作为答案发布,这样我就可以立即对其进行测试。您能否说明源数据中的[Date]列是什么,这样我就可以对其进行测试?Ta.最初为20130622.133644403。但到目前为止,我已将其转换为2013-06-22 13:36:44.403。您是否可以将该逻辑添加到我现有的查询中?只显示OnlyDate和OnlyTime?大多数情况下,这是一个简单的答案。谢谢
SELECT CONVERT(DATE,[Date])
SELECT CONVERT(TIME(0),[Date])
select 
   UpdatedOn , CONVERT(varchar,UpdatedOn,100) DateTime, CONVERT(varchar,UpdatedOn,10) Date , 
   CONVERT(varchar,UpdatedOn,108) Time , substring(CONVERT(varchar,UpdatedOn,106),1,2) Day, 
   substring(CONVERT(varchar,UpdatedOn,106),4,3) CMonth,    
   substring(CONVERT(varchar,UpdatedOn,105),4,2) 
   NMonth, substring(CONVERT(varchar,UpdatedOn,106),8,4) Year,      
   left(right(CONVERT(varchar,UpdatedOn,100),7),2) Hours_12, 
   substring(CONVERT(varchar,UpdatedOn,108),1,2) Hours_24, 
   substring(CONVERT(varchar,UpdatedOn,108),4,2) Minutes, 
   substring(CONVERT(varchar,UpdatedOn,108),7,2) Second, right(CONVERT(varchar,UpdatedOn,100),2)    
   AM_PM 
from 
   dbo.DeviceAssignSim where AssignSimId=55;