我们如何在SQL Server中的列中存储两次或更多次值 [英] How can we store two or more times value in column in SQL server

查看:63
本文介绍了我们如何在SQL Server中的列中存储两次或更多次值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我的桌子上有专栏,如TeaTimeIn,TeaTimeOut。

第一次

TeaTimeIn = 12:10 pm,

TeaTimeOut = 12:20 pm,

所以TeaBreakTimeSpent是10分钟。



第二次我们采取新的茶歇时间我们的早期TeaBreakTimeSpent被删除但是我想要这样如果我们在第一次采用teabreatime持续时间将使用查询存储teabreatime数量如果我们采取另一个茶歇,以便时间早期时间和新的持续时间将被添加并且显示这个时间的总和持续时间。

喜欢..

第一次



TeaTimeIn = 12:10 pm,

TeaTimeOut = 12:20 pm,

所以TeaBreakTimeSpent是10分钟。



第二次



TeaTimeIn = 3:30 pm,

TeaTimeOut = 3:35 pm,

所以TeaBreakTimeSpent是5分钟。



第三次

TeaTimeIn =下午6:10,

TeaTimeOut = 6:20 p m,

所以TeaBreakTimeSpent是10分钟。



所以所有的teabreaktimespent显示为25分钟。

如果它可以在查询中动态存储TeaBreakTimeSpent的第一次,在查询中动态第二次存储TeaBreakTimeSpent,在查询中动态第三次存储TeaBreakTimeSpent,并在将所有timeDuration与Teabreak相加并显示后再显示它。



我尝试过:



  SELECT   CONVERT  VARCHAR ,CreateDateTime, 105  AS  [LoginDate],
CONVERT varchar 15 ),CAST(StartTimeIn AS TIME ), 100 AS [STim e],
CONVERT varchar 15 ),CAST(EndTimeOut AS TIME ), 100 AS [ETime],
CONVERT varchar 15 ),CAST(MealTimeIn AS TIME ), 100 AS [MTime],
CONVERT varchar 15 ),CAST(MealTimeOut AS TIME ), 100 AS [MOUT],
CONVERT VARCHAR (<温泉n class =code-digit> 15 ),CAST(TeaTimeIn AS TIME ) , 100 AS [TTime],
CONVERT varchar 15 ),CAST(TeaTimeOut AS TIME ), 100 AS [TOUT],
CONVERT varchar 5 ),DATEADD(分钟,DATEDIFF(分钟,StartTimeIn,ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 114 AS [TimeSpent],
DATEDIFF(分钟,StartTimeIn,ISNULL(EndTimeOut,SWITCHOFFSET( SYSDATETIMEOFFSET(),' + 05:30'))) AS [TimeSpentMinutes],

CONVERT varchar 5 ),DATEADD(分钟,DATEDIFF(分钟,MealTimeIn,ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 114 AS [MealTimeSpent],
DATEDIFF(分钟,MealTimeIn,ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))) AS [ MealTimeSpentMinutes],

CONVERT varchar 5 ),DATEADD(分钟,DATEDIFF(分钟,TeaTimeIn,ISNULL) (TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 114 AS [TeaTimeSpent],
DATEDIFF(分钟,TeaTimeIn,ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))) AS [TeaTimeSpentMinutes],

CONVERT (< span class =code-keyword> varchar ( 5 ),DATEADD(分钟,DATEDIFF(分钟,OtherTimeIn,ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET)( ),' + 05:30'))), 0 ), 114 AS [OtherTimeSpent],
DATEDIFF(分钟, OtherTimeIn,ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSE T(),' + 05:30'))) AS [OtherTimeSpentMinutes],

CONVERT varchar 5 ),ISNULL(DATEADD(分钟,DATEDIFF(分钟,StartTimeIn,ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),') + 05:30'))), 0 ), 0 ) -
(ISNULL(DATEADD(分钟,DATEDIFF(分钟,MealTimeIn,ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 0 )+
ISNULL(DATEADD(分钟,DATEDIFF(分钟,TeaTimeIn,ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 0 )+
ISNULL(DATEADD(分钟,DATEDIFF(分钟,其他时间,ISNULL) (OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))), 0 ), 0 )), 114 AS [TimeSpentWork],

DATEDIFF(分钟,StartTimeIn,ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30'))) -
(ISNULL(DATEDIFF(分钟,MealTimeIn,ISNULL(MealTimeOut,SWITCHOFFSET)(SYSDATETIMEOFFSET( ),' + 05:30'))), 0 )+
ISNULL(DATEDIFF(分钟,TeaTimeIn,ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),' + 05:30' ))), 0 )+
ISNULL(DATEDIFF(分钟,OtherTimeIn,ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),'' + 05:30'))), 0 )) AS [TimeSpentMinutesWork]

FROM
DailyTimeRecord

解决方案

不要尝试在同一列中存储多个值,而是使用一个引用回主表的单独表。

所以如果你有一个员工表:

<前lang =文字> ID INT
名称NVARCHAR

添加休息表:

 ID INT 
EmpID INT,员工的FOREIGN KEY.ID
BkStart DATETIME
BkEnd DATETIME

然后您可以使用JOIN来检索给定日期的所有休息:

 SELECT e.Name,b.BkStart,b.BkEnd FROM Employees e 
JOIN Bre aks b ON b.EmpID = e.ID
WHERE b.BkStart BETWEEN ' 2016-10-11' AND ' 2016-10-12'





正如我两小时前告诉你的那样:不要在NVARCHAR中存储日期和时间 - 始终使用适当的数据类型。 NVARCHAR可能会让您的生活变得简单,但只要您开始对数据做任何事情,它就会让您的生活变得更加复杂。


Hello,I have column in table like TeaTimeIn,TeaTimeOut.
very first time
TeaTimeIn = 12:10 pm,
TeaTimeOut= 12:20 pm,
So TeaBreakTimeSpent is 10 minutes.

second time we take new tea break that time our earlyear TeaBreakTimeSpent is removed and take new value.but I want like this If we take number of teabreak the first time teabreatime duration will be store using query if we take another tea break so that time earlyear timeduration and new time duration will be added and display sum of this time duration.
like..
first time

TeaTimeIn = 12:10 pm,
TeaTimeOut= 12:20 pm,
So TeaBreakTimeSpent is 10 minutes.

Second time

TeaTimeIn = 3:30 pm,
TeaTimeOut= 3:35 pm,
So TeaBreakTimeSpent is 5 minutes.

third time
TeaTimeIn = 6:10 pm,
TeaTimeOut= 6:20 pm,
So TeaBreakTimeSpent is 10 minutes.

so all teabreaktimespent display like 25 minutes.
If it possible to store first time of TeaBreakTimeSpent dynamically in query and second time of TeaBreakTimeSpent dynamically in query and third time of TeaBreakTimeSpent dynamically in query and after sum all timeDuration of Teabreak and display it.

What I have tried:

SELECT CONVERT(VARCHAR, CreateDateTime,105) AS [LoginDate],
CONVERT(varchar(15),CAST(StartTimeIn AS TIME),100) AS [STime],
CONVERT(varchar(15),CAST(EndTimeOut AS TIME),100) AS [ETime],
CONVERT(varchar(15),CAST(MealTimeIn AS TIME),100) AS [MTime],
CONVERT(varchar(15),CAST(MealTimeOut AS TIME),100) AS [MOUT],
CONVERT(varchar(15),CAST(TeaTimeIn AS TIME),100) AS [TTime],
CONVERT(varchar(15),CAST(TeaTimeOut AS TIME),100) AS [TOUT],
CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, StartTimeIn, ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0), 114) AS [TimeSpent]  ,
DATEDIFF(minute, StartTimeIn, ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))) AS [TimeSpentMinutes],

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, MealTimeIn, ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0), 114) AS [MealTimeSpent]  ,
DATEDIFF(minute, MealTimeIn, ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))) AS [MealTimeSpentMinutes],

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, TeaTimeIn, ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0), 114) AS [TeaTimeSpent]  ,
DATEDIFF(minute, TeaTimeIn, ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))) AS [TeaTimeSpentMinutes],

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, OtherTimeIn, ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0), 114) AS [OtherTimeSpent]  ,
DATEDIFF(minute, OtherTimeIn, ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))) AS [OtherTimeSpentMinutes],

 CONVERT(varchar(5),ISNULL(DATEADD(minute, DATEDIFF(minute, StartTimeIn, ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0),0)-
        (ISNULL(DATEADD(minute, DATEDIFF(minute, MealTimeIn, ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(),'+05:30'))), 0),0) +
         ISNULL(DATEADD(minute, DATEDIFF(minute, TeaTimeIn, ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0),0) +
	     ISNULL(DATEADD(minute, DATEDIFF(minute, OtherTimeIn, ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))), 0),0)),114) AS [TimeSpentWork],

		 DATEDIFF(minute, StartTimeIn, ISNULL(EndTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30')))-
         (ISNULL(DATEDIFF(minute, MealTimeIn, ISNULL(MealTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))),0)+
          ISNULL(DATEDIFF(minute, TeaTimeIn, ISNULL(TeaTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))),0)+
          ISNULL(DATEDIFF(minute, OtherTimeIn, ISNULL(OtherTimeOut,SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30'))),0) ) AS [TimeSpentMinutesWork]

FROM  
DailyTimeRecord

解决方案

Don't try to store multiple values in the same column, instead use a separate table which refers back to the primary table.
So if you have an Employees table:

ID      INT
Name    NVARCHAR

Add a Breaks table:

ID      INT
EmpID   INT, FOREIGN KEY to Employees.ID
BkStart DATETIME
BkEnd   DATETIME

You can then use a JOIN to retrieve all the break for a given date:

SELECT e.Name, b.BkStart, b.BkEnd FROM Employees e
JOIN Breaks b ON b.EmpID = e.ID
WHERE b.BkStart BETWEEN '2016-10-11' AND '2016-10-12'



And as I told you two hours ago: don't store dates and times in NVARCHAR - always use an appropriate datatype. NVARCHAR may make your life simple to start with but it makes your life a lot, lot more complex as soon as you start to do anything with the data.


这篇关于我们如何在SQL Server中的列中存储两次或更多次值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆