Sql 转换日期&;时间
I.下表:- 我需要将其转换为:- 请注意,TIMEINA的日期必须与TIMEIN1完全一致。至于时间,将是固定的,即上午7:30、8:30等 我尝试了以下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
谢谢您应该将代码作为代码而不是图像发布 在任何情况下,您的代码都会将
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。