Sql 转换日期&;时间

Sql 转换日期&;时间,sql,sql-server,Sql,Sql Server,I.下表:- 我需要将其转换为:- 请注意,TIMEINA的日期必须与TIMEIN1完全一致。至于时间,将是固定的,即上午7:30、8:30等 我尝试了以下SQL,但不起作用:- 谢谢您应该将代码作为代码而不是图像发布 在任何情况下,您的代码都会将datetime值与time值进行比较。只要做一个转换。而不是timein1介于,使用: cast(timein1 as time) between . . . 编辑: 哦,你还需要把约会的全部内容公布出来。为此,请在日期时间上使用算术: ca

I.下表:-

我需要将其转换为:-

请注意,TIMEINA的日期必须与TIMEIN1完全一致。至于时间,将是固定的,即上午7:30、8:30等

我尝试了以下SQL,但不起作用:-


谢谢

您应该将代码作为代码而不是图像发布

在任何情况下,您的代码都会将
datetime
值与
time
值进行比较。只要做一个转换。而不是
timein1介于,使用:

cast(timein1 as time) between . . .
编辑:

哦,你还需要把约会的全部内容公布出来。为此,请在
日期时间
上使用算术:

cast('07:30:00' as datetime) + cast(cast(timein1 as date) as datetime)

timein1
上的双
cast
仅用于删除时间组件。

检查此脚本可能会对您有所帮助

print replace(convert(nvarchar(25) , getdate(), 120), '-', '') -- yyyyMMdd HH:mm:ss
print replace(convert(nvarchar(25) , getdate(), 102), '.', '') -- yyyyMMdd
print convert(nvarchar(25) , getdate(), 108) -- HH:mm:ss
这是T-SQL

SELECT  [Day],
        TIMEIN1,
        TIMEOUT1,
        DIVISION,
        EMPLOYEE,

        --IF TIMEIN1 is varchar
        LEFT(TIMEIN1, 9) +
        CASE
            WHEN DIVISION = 'KEP' AND RIGHT(TIMEIN1, 8) BETWEEN '04:30:00' AND '07:29:59'
                THEN '07:30:00'
            WHEN DIVISION = 'KEP' AND RIGHT(TIMEIN1, 8) BETWEEN '17:30:00' AND '19:29:59'
                THEN '19:30:00'
            WHEN DIVISION = 'SER' AND RIGHT(TIMEIN1, 8) BETWEEN '04:30:00' AND '08:29:59'
                THEN '08:30:00'
            WHEN DIVISION = 'SER' AND RIGHT(TIMEIN1, 8) BETWEEN '17:30:00' AND '20:29:59'
                THEN '20:30:00'
            ELSE '00:00:00'
        END AS TIMEINA


        --IF TIMEIN1 is Date Time
        , replace(convert(nvarchar(25) , TIMEIN1, 102), '.', '') + ' ' +
        CASE
            WHEN DIVISION = 'KEP' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '04:30:00' AND '07:29:59'
                THEN '07:30:00'
            WHEN DIVISION = 'KEP' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '17:30:00' AND '19:29:59'
                THEN '19:30:00'
            WHEN DIVISION = 'SER' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '04:30:00' AND '08:29:59'
                THEN '08:30:00'
            WHEN DIVISION = 'SER' AND convert(nvarchar(25) , TIMEIN1, 108) BETWEEN '17:30:00' AND '20:29:59'
                THEN '20:30:00'
            ELSE '00:00:00'
        END AS TIMEINA

FROM    tempdb.dbo.TSA

我的主要问题是有多少查询是针对这个表的

如果您在一个报表中执行此复杂逻辑,那么请务必使用SELECT

但它向我哭喊着要一个更好的解决方案

为什么不使用计算列?

由于它是一个日期且不确定,因此不能使用持久化关键字来物理存储计算值

但是,您将只在表定义中包含此代码,而不是在每个查询中

我对前两个范围和两个样本日期项目进行了案例分析。剩下的就看你了

-- Just play
use tempdb;
go

-- Drop table
if object_id('time_clock') > 0
drop table time_clock
go

-- Create table
create table time_clock
(
    tc_id int,
    tc_day char(3),
    tc_time_in datetime,
    tc_time_out datetime,
    tc_division char(3),
    tc_empid char(5),

    -- Use computed column
    tc_time_1 as
    (
    case 

      -- range 1
      when 
        tc_division = 'KEP' and 
        cast(tc_time_in as time) between '04:30:00' and '07:29:59'
      then 
        cast((convert(char(10), tc_time_in, 101) + ' 07:30:00') as datetime)

      -- range 2
      when 
        tc_division = 'KEP' and 
        cast(tc_time_in as time) between '17:30:00' and '19:29:59'
      then 
        cast((convert(char(10), tc_time_in, 101) + ' 19:30:00') as datetime)

      -- no match
      else NULL
    end
    ) 
);

-- Load store products
insert into time_clock values
(1,'SUN', '20131201 06:53:57', '20131201 16:23:54', 'KEP', 'A007'),
(2,'TUE', '20131201 18:32:42', '20131201 03:00:47', 'KEP', 'A007');

-- Show the data
select * from time_clock
预期结果


添加了sql server标记,因为这显然是sql server语法。TIMEIN1和TimeInOK的数据类型是什么,这将使我到达7.30 AM、8.30 AM等。但是,我仍然需要hv日期,格式为YYYYMMDD HH:MM:SS格式。日期是以时间为基础的。没关系,但有一些小问题。例如,TIMEIN1为2013120800:00:00将反映为1900-01-01 00:00:00。我需要它是2013120800:00:00。顺便说一句,结果是YYYY-MM-DD。如何将其更改为YYYYMMDD?好的,我已经修复了1900-01-01 00:00:00的问题,但如何将其保持为YYYYMMDD格式。您可以使用
convert()
datetime
转换回您想要的任何格式。我尝试了转换(varchar(8),timein1112),但它仍然显示为YYYY-MM-DD。