我们如何在SQL Server中的列中存储两次或更多次值 [英] How can we store two or more times value in column in 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 NVARCHARAdd a Breaks table:
ID INT EmpID INT, FOREIGN KEY to Employees.ID BkStart DATETIME BkEnd DATETIMEYou 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屋!