Как преобразовать округленное число в формат данных и времени - PullRequest
0 голосов
/ 01 ноября 2018

Две колонки в таблице tblpress

Date          Time
20160307      120949
20160307      133427

Необходимо выбрать ниже формата:

07-03-2016 12:09:49 07-03-2016 13:34 27

или

03-March-2016   12:09: 49 PM
03-March-2016   01:34: 27 PM

Ответы [ 4 ]

0 голосов
/ 01 ноября 2018

Вы сказали, что это числа, верно? Вы можете использовать datetimefromparts (или datetime2fromparts). то есть:

select 
 datetimefromparts(
  [date]/10000,
  [date]%10000/100,
  [date]%100,
  [time]/10000,
  [time]%10000/100,
  [time]%100,0)
from tblpress;

Демо-версия DB Fiddle

Обратите внимание, что присвоение имен таким полям, а также хранение даты и времени - плохая идея.

Позже я заметил, что это были поля char:

select 
  cast([date] as datetime) +
  cast(stuff(stuff([time],5,0,':'),3,0,':') as datetime)
from tblpress;
0 голосов
/ 01 ноября 2018

Вы можете попробовать ниже

select format(cast([Date] as date),'dd-MMMM-yyyy') as [Date],
TIMEFROMPARTS(LEFT([Time],2), SUBSTRING([Time],3,2), RIGHT([Time],2), 0,0) as [Time]
0 голосов
/ 01 ноября 2018

Лучший способ сделать это - создать функцию:

create FUNCTION [dbo].[udfGetDateTimeFromInteger]
(
   @intDate int,
   @intTime int
)
RETURNS datetime
AS BEGIN
-- Declare the return variable here
DECLARE @DT_datetime datetime = NULL,
  @str_date varchar(11),
  @str_time varchar(8)
if(@intDate is not null and @intDate > 0)
begin
  select @str_date = CAST( cast(@intDate as varchar(8)) AS date)
  if @intTime=0
     select @str_time ='000000'
  else
     select @str_time = right('0'+CONVERT(varchar(11),@intTime),6)
  select @str_time = 
   SUBSTRING(@str_time,1,2)+':'+SUBSTRING(@str_time,3,2)+':'+SUBSTRING(@str_time,5,2)

  select @DT_datetime = CAST(@str_date+' '+@str_time as datetime)
 end
 -- Return the result of the function
 RETURN @DT_datetime

 END

, а затем позвоните в select как:

declare @next_run_date int, @next_run_time int
select @next_run_date = 20160307
select @next_run_time = 130949

SELECT  @next_run_date inputdate,
                @next_run_time inputtime,
                dbo.udfGetDateTimeFromInteger(@next_run_date, @next_run_time) outputdatetime

Вывод будет таким:

inputdate   inputtime   outputdatetime
20160307    130949      2016-03-07 13:09:49.000
0 голосов
/ 01 ноября 2018

Я думаю CAST/CONVERT поможет вам:

SELECT
  CAST('20160307' AS date),
  CAST(STUFF(STUFF('120949',3,0,':'),6,0,':') AS time)

И конвертировать для:

SELECT
  CONVERT(varchar(20),NormalDate,105) OutDate, -- Italian style
  CONVERT(varchar(20),NormalTime,108) OutTime -- hh:mi:ss
FROM
  (
    SELECT
      CAST([Date] AS date) NormalDate,
      CAST(STUFF(STUFF([Time],3,0,':'),6,0,':') AS time) NormalTime
    FROM YourTable
  ) q

CAST и CONVERT (Transact-SQL)

И вы можете использовать FORMAT (Transact-SQL)

SELECT
  FORMAT(GETDATE(),'dd-MM-yyyy'),
  FORMAT(GETDATE(),'HH:mm:ss')
...