在SQL中将日期分成两列(日期+时间)

2024-05-07 18:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  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年6月22日

时间(删除微秒): 13: 36:44分

是否可以修改我现有的查询以显示所需的输出?非常感谢。请注意:我正在使用SQL Server Management Studio 2008。


Tags: fromconvertdatetimedateobjectas时间数字
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;

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

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

SELECT CONVERT(DATE,[Date])
SELECT CONVERT(TIME(0),[Date])

相关问题 更多 >