【问题标题】:Splitting Date into 2 Columns (Date + Time) in SQL在 SQL 中将日期拆分为 2 列(日期 + 时间)
【发布时间】:2018-06-09 14:02:51
【问题描述】:

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

  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。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    SELECT CONVERT(DATE,[Date])
    SELECT CONVERT(TIME(0),[Date])
    

    【讨论】:

    • 大多数情况下,只需简单的答案即可完成。谢谢!
    【解决方案2】:

    您可能想研究 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;
    

    您可能希望将其中的一部分移到视图中,以降低复杂性。

    【讨论】:

    • 如何让它显示问题所需的输出?
    • 将 getdate() 替换为原始 SQL 中的 [Date] 字段。我会稍微更新答案以包含您的原始问题。
    • 我应该在我的查询中添加到哪里?您是否可以将其添加到我现有的查询中,然后将其作为答案发布,以便我可以立即对其进行测试。
    • 您能否说明源数据中的 [Date] 列是什么,所以我有一个值得测试的值?塔。
    • 最初是 20130622.133644403。但到目前为止,我已将其转换为 2013-06-22 13:36:44.403
    【解决方案3】:

    你可以使用STUFF function:

    DECLARE @MyTable TABLE([Date] VARCHAR(20));
    INSERT  @MyTable ([Date])
    VALUES  ('20130622133644403');
    
    SELECT  y.*,
            CONVERT(DATE,y.Date_AsDateTime) AS OnlyDate,
            CONVERT(TIME(0),y.Date_AsDateTime) AS OnlyTime
    FROM(
        SELECT  x.[Date] AS Date_AsVarChar, CONVERT(DATETIME, STUFF(STUFF(STUFF(STUFF(x.[Date],9,0,' '),12,0,':'),15,0,':'),18,0,'.')) AS Date_AsDateTime
        FROM    @MyTable x
    ) y;
    

    结果:

    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;
    

    【讨论】:

    • 您是否可以将该逻辑添加到我现有的查询中?只显示 OnlyDate 和 OnlyTime?
    【解决方案4】:

    使用以下方案获取日期、时间、日、月、年、小时、分钟、秒、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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2021-11-08
      • 2019-02-20
      • 2013-10-18
      • 2018-08-28
      • 1970-01-01
      • 2022-06-14
      • 2020-10-05
      相关资源
      最近更新 更多