J'ai le code suivant qui fonctionne, mais comment puis-je obtenir les minutes du terminal pour afficher la sortie sous forme de jour, heure, minute? Si cela ne peut pas être fait, est-il possible d'ajouter un +1 sur l'heure qui indiquerait que c'est le jour suivant?
Le problème que j'ai est que lorsque nos commandes dépassent 23h59, le système n'affiche pas le bon format en raison de la période de 24 heures.
Je suis perplexe et j'espère ne pas confondre les choses.
SELECT FOLIO_NUMBER, TERMINAL_NAME, format((START_LOAD_TIME - ORDER_ENTRY_TIME), 'HH:mm') AS STAGING_MINUTES, format((TERM_END_LOAD_TIME - START_LOAD_TIME), 'HH:mm') AS LOADING_MINUTES, format((TERM_END_LOAD_TIME - ORDER_ENTRY_TIME), 'HH:mm') AS TERMINAL_MINUTES FROM ORDERS JOIN TERMINAL_OWNER ON ORDERS.LOADING_TERMINAL_ID = TERMINAL_OWNER.TERMINAL_ID
3 Réponses :
Je pense que vous cherchez quelque chose comme ceci
Create table #Temp (MinValue Varchar(8))
insert into #Temp Values ('19:25')
Select TotMinute / 720 as NoDays -- 1440 minutes per day
, (TotMinute % 720) / 60 as NoHours -- modulo 1440
, (TotMinute % 60) as NoMinutes -- modulo 60
from(
select
(Cast(
Cast(left(MinValue,charindex(':',MinValue)-1) as Int) * 60
+ Cast(substring(MinValue,charindex(',',MinValue)+4,len(MinValue)) as Int)
as Int ) * 60) / 60 as TotMinute
from #Temp
)a
La sortie ressemblera à celle ci-dessous.
Vous pouvez convertir cette table de source de données de requête comme indiqué ci-dessous.
Declare @theMinutes Varchar(10)
Set @theMinutes = '19:25'
declare @totMintute int
Select
@totMintute = (Cast(
Cast(left(@theMinutes,charindex(':',@theMinutes)-1) as Int) * 60
+ Cast(substring(@theMinutes,charindex(',',@theMinutes)+4,len(@theMinutes)) as Int)
as Int ) * 60) / 60
--For 12 hour 1 days
Select @totMintute / 720 as NoDays -- 720 minutes per day
, (@totMintute % 720) / 60 as NoHours -- modulo 720
, (@totMintute % 60) as NoMinutes -- modulo 60
--For 24 hour 1 days
Select @totMintute / 1440 as NoDays -- 1440 minutes per day
, (@totMintute % 1440) / 60 as NoHours -- modulo 1440
, (@totMintute % 60) as NoMinutes -- modulo 60
Vous pouvez trouver la démo en direct ici .
Merci, comment puis-je ajouter les résultats à afficher comme une seule au lieu de 2 fenêtres séparées?
@ArriBenson Je ne t'ai pas compris? J'ai exécuté deux requêtes, mais vous ne devez en exécuter qu'une, donc une seule fenêtre s'affiche.
oui, pour le moment, la requête s'exécute mais affiche les résultats séparément comme dans votre capture d'écran.
Je pense que vous pouvez utiliser comme a + b + c comme d. Ici a est NoDays, b est No hour ...
DECLARE @INT INT SET @INT = DATEDIFF(SECOND,GETDATE(),GETDATE()+1) select convert(varchar(10), (@INT/86400)) + ':' + convert(varchar(10), ((@INT%86400)/3600)) + ':'+ convert(varchar(10), (((@INT%86400)%3600)/60)) + ':'+ convert(varchar(10), (((@INT%86400)%3600)%60)) as 'DD:HH:MM:SS' Courtesy of Nat-MS. See here
Je dirais que vous devriez supprimer la nécessité d'identifier les jours / heures dans la sortie SQL et obtenir simplement la différence en minutes, avec laquelle vous pouvez ensuite travailler dans votre couche d'application.
Prenez cet exemple de code :
FOLIO_NUMBER STAGING_MINUTES LOADING_MINUTES TERMINAL_MINUTES 1 1440 1440 2880
Cela affichera la différence en minutes entre les événements:
create table #orders (
FOLIO_NUMBER int,
START_LOAD_TIME datetime,
ORDER_ENTRY_TIME datetime,
TERM_END_LOAD_TIME datetime
)
insert into #orders (FOLIO_NUMBER,START_LOAD_TIME,ORDER_ENTRY_TIME,TERM_END_LOAD_TIME)
values (1, getdate(),getdate() - 1,getdate() + 1)
select *,
datediff(mi, ORDER_ENTRY_TIME, START_LOAD_TIME) AS STAGING_MINUTES,
datediff(mi, START_LOAD_TIME, TERM_END_LOAD_TIME) AS LOADING_MINUTES,
datediff(mi, ORDER_ENTRY_TIME, TERM_END_LOAD_TIME) AS TERMINAL_MINUTES
from #orders
drop table #orders
Vous pouvez ensuite effectuer quelques calculs simples avec ces valeurs pour extraire, jours, heures et minutes.
votre solution ci-dessus est une idée en affichant les minutes, mais la sortie s'affiche lorsque vous indiquez au-dessus d'un résultat sur une seule ligne, mon problème est que j'ai besoin des informations par numéro de folio comme indiqué ci-dessus. Je m'attendrais à voir le même nombre de lignes qu'il y a de folios, c'est-à-dire 10 folios = 10 lignes sur le résultat. S'il vous plaît aviser si vous le pouvez?
@ArriBenson ceci est juste un exemple avec une ligne, il afficherait plusieurs lignes s'il y avait plus de données présentes.
avez-vous vu ma capture d'écran - il y a plusieurs lignes et lorsque j'exécute votre requête, elle n'affiche qu'une ligne?
@ArriBenson c'est un exemple de code ... si vous avez créé du SQL que j'aurais pu copier et coller, j'aurais ajouté plus de lignes, mais à la place, vous avez publié une image que je ne peux pas utiliser pour générer des exemples de données.
Quels dbms utilisez-vous? (Cette requête est spécifique au produit.)
Désolé, SQL Server 2012
Pouvez-vous effectuer la sélection sans le formatage de la chaîne, puis effectuer le formatage dans le frontal où il est affiché? Habituellement, les langages de programmation qui traitent des interfaces utilisateur ont des moyens plus simples de faire ce que vous voulez par rapport à SQL.
Les minutes du terminal sont calculées en soustrayant term_end_load_time de l'heure order_entry (du début à la fin). Cependant, ils veulent que les en-têtes de transfert / chargement affichent uniquement l'heure (heure) et les minutes du terminal pour afficher le jour, l'heure et les minutes si une commande s'étend sur une période de 24 heures.
Que signifient
TERM_END_LOAD_TIMEetORDER_ENTRY_TIME? Vous ne pouvez pas utiliser de soustraction avectemps.@ArriBenson vous l'avez expliqué dans le texte de la question. Quels sont les types de champs ? Ils ne peuvent pas être
time. Si vous soustrayez les champsdatetime, vous récupérez unedatetime@ArriBenson L'image ressemble à SSMS - qui n'est pas destiné à la production. Existe-t-il un autre programme pour les utilisateurs finaux?
Êtes-vous en train de dire que je dois utiliser la date au lieu de l'heure?
@ArriBenson Je dis que vous n'utilisez pas le temps pour le moment. Si vous le faisiez, vous obtiendriez une erreur de syntaxe indiquant que
L'heure du type de données de l'opérande n'est pas valide pour l'opérateur de soustraction.Ne publiez pas d'images. Publiez les types de champs .Désolé, je suis confus ici - Si vous voulez dire les types de champs comme dans les en-têtes, ils sont Start_Load_Time, Order_Entry_time, Term_End_Load_Time, Folio_Number.
@ArriBenson si les champs sont
datetimevous pouvez utiliserselect format (TERM_END_LOAD_TIME - ORDER_ENTRY_TIME, 'dd \ HH: mm')pour formater la différenceLes bases de données @ArriBenson n'ont pas d'en-tête. Ils ont des tableaux avec colonnes . Ces colonnes ont des types qui contrôlent ce que vous pouvez ou ne pouvez pas faire avec leurs valeurs. Quelles colonnes voyez-vous lorsque vous développez le nœud
Colonnessous la tableORDERSdans l'Explorateur d'objets? Quels sont les types de champs?social.msdn.microsoft.com/Forums/sqlserver/en-US/...